У меня настоящие проблемы с издевательством, когда дело доходит до EF (версия 6, какая она стоит).
Это метод, который я пытаюсь проверить:
public async Task<bool> IsSurveyComplete(Guid entityRef)
{
using (MyDbEntities context = new MyDbEntities())
{
MyEntity entity = await context.MyEntities.FindAsync(entityRef);
// do stuff
}
}
Мне нужно подделать «объект», но я понял, что просто попытка выполнить 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));
Однако свойство ProxyCreationEnabled по-прежнему имеет значение true, когда я помещаю точку останова в метод IsSurveyComplete после оператора using.
Я также пробовал (среди многих, многих других вещей):
var fakeContext = new MyDbEntities(false);
Isolate.Swap.AllInstances<MyDbEntities>().With(fakeContext);
Опять же, когда я исследую точку останова, ProxyCreationEnabled истинно.
Я собираюсь отказаться от TypeMock!