AutoFake Указанный объект не распознается как поддельный объект.проблема, когда попробуйте метод заглушки Сута - PullRequest
0 голосов
/ 01 июня 2018

Я столкнулся с проблемой, связанной с собственным методом объекта moting sut, например:

AutoFake FakeResolver = new AutoFake();
ProductQueryService _sut = FakeResolver.Resolve<ProductQueryService>();
// stubing another virtual method in the testing object itself
A.CallTo(() => _sut.GetLookupCache()).Returns(Task.FromResult(fakeData)); // throws ArgumentException:The specified object is not recognized as a fake object

//method under test is GetBrands
List<BrandDto> brands = await _sut.GetBrands();

Есть ли какие-либо предложения по этому поводу?

1 Ответ

0 голосов
/ 01 июня 2018

Я думаю, что проблема в том, что Autofac.Extras.FakeItEasy не подделывает конкретные типы, вместо этого возвращается к поведению контейнера по умолчанию при создании фактического экземпляра запрошенного типа.Я не эксперт по Autofac, но вот мои рассуждения:

В документах , мы видим, что пакет

… позволяет автоматически создавать поддельные зависимости длякак конкретные, так и поддельные абстрактные экземпляры в модульных тестах с использованием контейнера Autofac

Формулировка немного двусмысленна, но я думаю, что это говорит о том, что будут предоставлены конкретные зависимости и абстрактные экземпляры будут поддельными.

Затем я взглянул на реализацию и нашел в FakeRegistrationHandler this:

if (typedService == null ||
    (!typedService.ServiceType.GetTypeInfo().IsInterface && !typedService.ServiceType.GetTypeInfo().IsAbstract) ||
    (typedService.ServiceType.GetTypeInfo().IsGenericType && typedService.ServiceType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) ||
    typedService.ServiceType.IsArray ||
    typeof(IStartable).IsAssignableFrom(typedService.ServiceType))

Это проверка, чтобы увидеть, будет ли расширение подделывать запрошенный тип сервиса.Конкретный ProductQueryService не является интерфейсом или абстрактным, поэтому я думаю, что контейнер ничего не сделает.

Я не вижу простого способа проинструктировать расширение подделывать все конкретные типы, но яуверен, что вы можете добавить одноразовую регистрацию для любого конкретного типа (или набора типов - возможно, всего в вашем пространстве имен), который вам нравится.

Я собирался предложить поднять проблему с Autofac, но я вижу вы сделали это .Хотелось бы, чтобы я сначала посмотрел туда.


Я также предупреждаю, что в целом подделка тестируемой системы не является моим первым выбором методов тестирования.Если возможно, я бы извлек зависимость, которая может быть введена в вашу SUT.Тогда подделайте это.Если он представлен как интерфейс или абстрактный класс, вы можете легко использовать Autofac.Extras.FakeItEasy для его предоставления.

А пока я собираюсь сделать некоторые заметки на Autofac.Extras.FakeItEasyвыпуск 14 .

...