Typemock Isolator:如何模拟未注入的DbContext?

时间:2017-03-13 22:30:36

标签: c# entity-framework unit-testing dependency-injection typemock-isolator

我在Asp.Net MVC项目中测试我的存储库,我需要为我的单元测试模拟一个DbContext。没有注入DbContext,我无法更改代码。

我检查了这个answer,我一步一步地跟着它,但它没有用。这是我的代码,我试图简化它:

    [TestMethod]
    public void SaveAmountsAfterCalculation()
    {
        // Faking the Context
        var fakeContext = Isolate.Fake.NextInstance<MyContext>();
        Isolate.WhenCalled(() => new MyContext()).WillReturn(fakeContext);

        // Faking one the the DbSetList of the Context
        Isolate.WhenCalled(() => fakeContext.SomeDbSet)
        .WillReturnCollectionValuesOf(somehtingElseList);

        // Calling the method to test
        MyRepository.SaveAmountsAfterCalculation();

        // Verifying if SomeProperty was called
        Isolate.Verify.WasCalledWithAnyArguments(() => fakeContext
        .SomeProperty.Attach(null));
    }

在using语句中创建上下文时,不会抛出任何异常。

using (var ctx = new MyContext())
{
   ...
   // The exception is thrown here.
   if (ctx.SomeDbSet.Any(...))
   ...
}

但是如果我检查任何属性(DbSet),那么我可以看到这个错误:没有名为&#39; MyContext&#39;的连接字符串可以在应用程序配置文件中找到。。我已经在我的Test项目中添加了一个连接字符串,但它也没有工作。调用SomeDbSet的那一刻,即使我告诉TypeMock用somethingElse替换该方法的结果,也会抛出异常。请参阅上面的代码。

1 个答案:

答案 0 :(得分:0)

看起来像"Isolate.WhenCalled(() => new MyContext()).WillReturn(fakeContext);&#34;已经过时,可能会导致您的问题,因为您在使用 fakeNextInstance 时已经伪造了 "new MyContext()" 这一电话。