1

私はデータベースリポジトリクラスを持っています:

public class DatabaseRepository : IRepository
    {
        private readonly Database _database;

        public DatabaseRepository(Database database)
        {
            _database = database;
        }

        ...

        public void Delete<TObject>(TObject entity) where TObject : BaseEntity
        {
            var dbSet = DbSet<TObject>();
            dbSet.Remove(entity);
            Save();
        }

        ...

        private void Save()
        {
            try
            {
                 _database.SaveChanges();
            }
            catch(DbEntityValidationException dbEx)
            {
                // do some action
            }
        }    
    }

catchメソッドのブロックをテストするprivate void Save()必要があるので、次のようなものが必要です...

[TestMethod]
public void SaveShouldDoSomethingIfDabaBaseConnectFalls()
{
    Mock<Database> mockDb = new Mock<Database>();
    mockDb.Setup(db => db.SaveChange()).Throws(new DbEntityValidationException());

    IRepository repository = new DatabaseRepository(mockDb.Object);

    ...
}

だから私の質問は、どのようにエンティティフレームワークデータベースをモックすることができますか?Mock<Database> mockDb = new Mock<Database>();-正しく書く方法???? モックには。を使用しますMoq

4

1 に答える 1

4
  1. 典型的なプロパティのセットをIDatabase使用して、のインターフェイスを定義しますDbContextIIDbSet<T>
  2. 埋め込むFakeDbSet<T>: IDbSet<T>
  3. 代わりにRepository使用するように更新IDatabaseDatabase

その後、のモックを作成できますIDatabase

http://refactorthis.wordpress.com/2011/05/31/mock-faking-dbcontext-in-entity-framework-4-1-with-a-generic-repository/

そうすることで、偽のデータベースセットに対して実装された単体テストは、コードが実際のデータベースに対して機能することを保証しないことを覚えておいてください。

LINQ-to-Entities(real DbSet)は、LINQ-to-Objects(FakeDbSet)がサポートする多くの機能をサポートしていません。そのため、データベースを操作するときに、実行時にコードが失敗する可能性があります。

この制限により、偽のDbSetに対して実装された単体テストが役に立たなくなることはありません。テストでは、リポジトリに実装されているビジネスルールをテストできます。ただし、更新されたすべてのlinqステートメントを(手動または統合テストから)実際のデータベースLINQ-to-Entities dbプロバイダーに対して実行して、プロバイダーがそれをサポートしていることを確認する必要があります。

この「聖戦」のトピックに関する詳細情報はここにあります-テストするEntityFramework4.1の偽のDbContext

于 2012-07-13T03:01:37.050 に答える