私はユニットテスト(TDD)で自分の足を濡らしています。私はテストするために探している基本的なリポジトリパターンを持っています。この段階で私は自分のドメインをテストしていますが、コントローラとビューについて心配する必要はありません。それを簡単に保つためにデモプロジェクトがあります。リポジトリパターンを使用している場合のドメインのテスト
クラス
public class Person
{
public int PersonID { get; set; }
public string Name{ get; set; }
}
インタフェース
public interface IPersonRepository
{
int Add(Person person);
}
コンクリート
public class PersonnRepository : IPersonRepository
{
DBContext ctx = new DBContext();
public int Add(Person person)
{
// New entity
ctx.People.Add(person);
ctx.SaveChanges();
return person.id;
}
}
私は私のテストプロジェクトにNUnitのとMOQを追加し、適切に機能をテストする方法を知りたいきました。
私はそれが正しいとは確信していませんが、いくつかのブログを読んだ後、私はFakeRepositoryを作成しました。しかし、これに基づいてテストすれば、私の実際のインターフェースをどのように検証しますか?その後、
[Test]
public void Creating_A_Person_Should_Return_The_ID()
{
FakePersonRepository repository = new FakePersonRepository();
int id = repository.Add(new Person { Name = "Some Name" });
Assert.IsNotNull(id);
}
でテスト
public class FakePersonRepository
{
Dictionary<int, Person> People = new Dictionary<int, Person>();
public int Add(Person person)
{
int id = People.Count + 1;
People.Add(id, person);
return id;
}
}
は正しいマナーでの試験に私はどこにも近いのですか?
今後、名前を渡さないなどのエラーが発生するなどのテストをしたいと考えています。
ありがとうございます。私は理解が間違っているか、私の例が混乱しているかもしれません。この場合、dbContextは、EFとデータベースで作業できるようにするEF DbContextを表すことを意図していました。したがって、あなたが表示するプロパティはありません。 私の具象PersonRepositoryはデータベースに書き込むためにEFにアクセスしますが、これは単体テストではなく、後で統合テストされたことを示しています。 – stevejgordon
私は、私が私のテストを意味していることを保証したいと思っていた同じインタフェースを実装している(私のメソッドを確認するためのdbを取るための)インメモリ版が必要だと推測していました。私はMVC、EFコード、TDDのコンセプトの両方に慣れていないので少し失われていると思います。 – stevejgordon
インターフェイスではなく、具体的な実装をテストします。これを行うには、実装をDBContextから切り離す必要があります。その理由は、PersonRepository具象クラスに注入できるインターフェイスを抽出することを提案したからです。 単体テストの鍵は、クラス内のコードを分離できるように、すべての依存関係を注入可能にすることです。単体テストでは、依存関係の模擬バージョンを渡します。あなたの場合、これは上記のようにDBContextを注入できる必要があることを意味します。 –