【问题标题】:Testing repository with DbContext - mocking issue concerning IDbSet使用 DbContext 测试存储库 - 关于 IDbSet 的模拟问题
【发布时间】:2012-10-14 06:34:13
【问题描述】:

我正在尝试测试使用 DbContext 的存储库

我遇到的问题是 DbCONtext 想要为某些类型返回 DbSet

我什至不能模拟 IDbSet,因为它有一个 PRIVATE CTOR?!?!?!

大家是怎么克服这个问题的?

【问题讨论】:

    标签: entity-framework unit-testing mocking tdd


    【解决方案1】:

    您需要使用适配器或包装器。 DbContext 是第三方代码。你的代码应该把它隐藏在一个抽象后面,记住这只是一个关于你的系统内部如何工作的实现细节。您应该可以随时更改此设置。

    public class ThatsHardToTest
    {
        // Private constructors, slow start up time etc...
    
        public int AlwaysReturnOneExceptInSuperRareScnearios()
        {
            // Complex logic.
            return 1;
        }
    }
    

    现在如果我们想在上述方法出错时测试我们的代码,例如数据库系统离线。我不希望测试命中数据库,所以我们需要一个围绕这个第三方代码的适配器。我要么做一个接口,要么做一个基类。

    public class MyTestAdapter : IExampleAdapter
    {
        public int ReturnWhateverIWant()
        {
            return -1;
        }
    }
    

    我会使用MyTestAdapter 对我的代码进行单元测试,因为我可以控制它的作用。对于生产代码,您只需将其替换为委托给实际生产系统的适配器即可。例如:

    public class MyRealAdapter : IExampleAdapter
    {
        public int ReturnWhateverIWant()
        {
            return new ThatsHardToTest().AlwaysReturnOneExceptInSuperRareScnearios();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-09
      • 2021-09-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多