Мокинг с помощью Entity Framework и TypeMock

У меня настоящие проблемы с издевательством, когда дело доходит до 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!


person user176504    schedule 09.09.2016    source источник
comment
Не могли бы вы загрузить свой код IsSurveyComplete и свой тест?   -  person Gregory Prescott    schedule 11.09.2016


Ответы (1)


декламатор: я работаю в 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);

person Daniel    schedule 12.09.2016