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

时间:2012-10-24 08:31:52

标签: entity-framework unit-testing mocking tdd

我正在尝试测试使用DbContext

的存储库

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

我甚至无法模仿IDbSet,因为它有一个私有的CTOR?!?!?!

每个人如何克服这个?

1 个答案:

答案 0 :(得分:0)

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