Entity framework 使用DbContext测试存储库-关于IDbSet的模拟问题

Entity framework 使用DbContext测试存储库-关于IDbSet的模拟问题,entity-framework,unit-testing,mocking,tdd,Entity Framework,Unit Testing,Mocking,Tdd,我正在尝试测试使用DbContext的存储库 我遇到的问题是DbCOntext希望返回某些类型的DbSet 我甚至不能嘲笑IDbSet,因为它有一个私人的CTOR 大家是如何克服这个问题的?您需要使用适配器或包装器。DbContext是第三方代码。您的代码应该将其隐藏在抽象后面,记住这只是关于系统内部如何工作的实现细节。您可以随时更改此设置 public class ThatsHardToTest { // Private constructors, slow start up time

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

我遇到的问题是DbCOntext希望返回某些类型的DbSet

我甚至不能嘲笑IDbSet,因为它有一个私人的CTOR


大家是如何克服这个问题的?

您需要使用适配器或包装器。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();
    }
}