模拟实体框架和TypeMock

时间:2016-09-09 17:02:48

标签: mocking entity-framework-6 typemock typemock-isolator

对于EF(版本6,因为它的价值而言),我在模拟方面遇到了实际问题。

这是我试图测试的方法:

    public async Task<bool> IsSurveyComplete(Guid entityRef)
    {
        using (MyDbEntities context = new MyDbEntities())
        {
            MyEntity entity = await context.MyEntities.FindAsync(entityRef);
            // do stuff
        }
    }

我需要伪造&#34; entity&#34;,但我意识到只是尝试做Isolate.Fake.Instance并不起作用,因为它实际上是一个ObjectProxy而不是一个实例输入MyEntity。我发现解决这个问题的方法是将context.Configuration.ProxyCreationEnabled设置为false。 但是,如果我在构造函数中的任何地方执行此操作,则无法工作。如果我试图伪造DbContextConfiguration,它仍然使用代理。

因此,我创建了一个在测试时使用的新构造函数:

    public MyDbEntities(bool useProxy)
        : base("name=MyDbEntities")
    {
        this.Configuration.ProxyCreationEnabled = useProxy;
    }

然后,在我的测试中:

    Isolate.WhenCalled(() => new MyDbEntities()).WillReturn(new MyDbEntities(false));

但是,当我在using语句之后在IsSurveyComplete方法中放置断点时,ProxyCreationEnabled属性仍然设置为true。

我也尝试过(在许多其他事情中):

    var fakeContext = new MyDbEntities(false);
    Isolate.Swap.AllInstances<MyDbEntities>().With(fakeContext);

同样,当我使用断点进行调查时,ProxyCreationEnabled为真。

我即将放弃TypeMock!

1 个答案:

答案 0 :(得分:2)

declaimer:我正在使用typemock

你使用了错误的typemock功能,你应该使用:

var fakeContext = Isolate.fake.NextInstance<MyDbEntities>();
Isolate.whenCalled(()=>fakeContext.MyEntities).
   WillReturnCollectionValuesOf(listOfEntities.AsQueryable());

而不是:

var fakeContext = new MyDbEntities(false); Isolate.Swap.AllInstances<MyDbEntities>().With(fakeContext);