0

これは、コードの調査と作成に 3 日間を費やした結果です。私は EF Code First (EF5) と、その上に構築された汎用リポジトリ パターンを持っています。 インフラストラクチャー

今私は持っていICustomerRepository<Customer> : IRepository and CustomerRepository : RepositoryBase<MyContext> , ICustomerRepositoryます。したがって、これをテストしようとすると、 A FakeDbContext 、 A Fake IDbSet を記述してから、データを Fake し、さらに多くのことを行う必要があることがわかりました。これはすべて、インメモリ データを使用して Linq to Objects をテストし、Linq to Entities には統合テストの形式で別のテスト スイートが必要であることがわかっている場合です。したがって、私のコード構造が間違っているために単体テストを書くのが非常に難しいか、私が知らないテストを書くためのより良い方法があるか、統合テストが必要です。NUnit と MOQ を使用しています。

編集:私がテストしようとしているのは何ですか?GetCustomersByType 、 Add 、 GetOrderPlacedByCustomer などのメソッドをチェックしようとしています。これらのメソッド内のロジックが正しいかどうかを確認しようとしています。これが単体テストの目的だと思います。

4

2 に答える 2

2

各テスト、つまりブラックボックステストの前にすべてのデータをセットアップするテスト初期化メソッドを作成すると、さらに多くのことが得られると思います。結局、リポジトリレイヤーは、モックされたデータベースではなく、実際のデータベースで適切に機能していることがわかります。

例えば:

    public static void Init()
    {
        _unityContainer = new UnityContainer();
        _unityContainer.LoadConfiguration();
        _persistenceFactory = _unityContainer.Resolve<IPersistenceFactory>();
        _unitOfWork = _persistenceFactory.GetUnitOfWork();
        _usersRepository = _persistenceFactory.GetUsersRepository();
        _usersRepository.RemoveAll();
        _unitOfWork.Commit();
    }

    public static void InsertTestData()
    {
       User u = new User("johndoe@gmail.com", "John Doe", "johndoe");

        _usersRepository.Add(u);
        _unitOfWork.Commit();
    }
于 2012-11-29T12:48:07.100 に答える
1

DBアクセスをシミュレートするために使用できますTransactionScopeが、データベースへの実際の変更をコミットすることはできません。このようなもの:

[TestMethod]
public void AddingShouldWork()
{
    using (var transaction = new TransactionScope())
    {
        var repository = new ICustomerRepository<Customer>();
        var customer = new Customer();
        customer.Name = "OEM Computers Inc.";
        repository.Add(customer);
    }
}

操作を呼び出さないことによりtransaction.Complete()、操作はロールバックのように扱われ、データベースの挿入は行われません。これは、ユニット(統合ではない)テストに必要な動作です。Moq<Customer>実体を作成しないために使用することもできます。

于 2012-11-29T12:50:50.457 に答える