对于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!
答案 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);