如何模拟Codefirst策略创建的EntityFramework数据库? [英] How to mock EntityFramework Database created by codefirst strategy?

查看:73
本文介绍了如何模拟Codefirst策略创建的EntityFramework数据库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个数据库存储库类:

I have a database repository class:

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
            }
        }    
    }

我需要测试private void Save()方法的catch块,所以我需要类似的东西...

I need to test catch block of private void Save() method, so I need something like...

[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.

So my question is how can I mock entity framework Database? Mock<Database> mockDb = new Mock<Database>(); - how to write it correctly???? For mocking I use Moq.

推荐答案

  1. 使用一组典型的IIDbSet<T>属性为DbContext定义IDatabase界面
  2. 实施FakeDbSet<T>: IDbSet<T>
  3. 更新Repository以使用IDatabase代替Database
  1. Define IDatabase interface for your DbContext with set of typified IIDbSet<T> properties
  2. Implement FakeDbSet<T>: IDbSet<T>
  3. Update Repository to use IDatabase instead of Database

之后,您可以构建IDatabase的模拟.

After that you can construct mock of IDatabase.

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

记住,针对伪数据库集实现的单元测试不能保证您的代码将对真实数据库有效.

With doing that remember that unit test implemeted against fake db set does not guarantee that your code will work against real database.

LINQ-to-Entities(真实的DbSet)不支持LINQ-to-Objects(FakeDbSet)所支持的许多功能.因此,当您使用数据库时,您的代码可能会在执行时失败.

LINQ-to-Entities (real DbSet) does not support many features that LINQ-to-Objects (FakeDbSet) does. So your code can fail in execution-time when you work with database.

此限制不会使针对伪造的DbSet实施的单元测试无效.测试仍然可以测试在您的存储库中实现的业务规则.但是您需要针对真实数据库LINQ-to-Entities数据库提供程序运行每个更新的linq语句(手动或通过集成测试),以确保该提供程序支持它.

This restriction does not make unit tests implemented against faked DbSet useless. Test still can test business rules implemented in your repository. But you need to run every updated linq statement (manually or from integration test) against real database LINQ-to-Entities db provider to make sure that provider support it.

此处有有关此圣战"主题的更多信息-

There are more info regarding this "holy war" topic here - Fake DbContext of Entity Framework 4.1 to Test

这篇关于如何模拟Codefirst策略创建的EntityFramework数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆