Насмешка типа с внутренним использованием конструктора Moq

Я пытаюсь дразнить класс от Microsoft Sync Framework. Это только имеет внутреннего конструктора. Когда я пробую следующее:

var fullEnumerationContextMock = new Mock<FullEnumerationContext>();

Я получаю эту ошибку:

Система. NotSupportedException: Родитель не имеет конструктора по умолчанию. Конструктор по умолчанию должен быть явно определен.

Это - отслеживание стека:

Система. Отражение. Испустить. TypeBuilder. DefineDefaultConstructorNoLock (атрибуты MethodAttributes) Система. Отражение. Испустить. TypeBuilder. DefineDefaultConstructor (атрибуты MethodAttributes) Система. Отражение. Испустить. TypeBuilder. CreateTypeNoLock () Система. Отражение. Испустить. TypeBuilder. CreateType () Замок. DynamicProxy. Генераторы. Эмиттеры. AbstractTypeEmitter. BuildType () Замок. DynamicProxy. Генераторы. ClassProxyGenerator. GenerateCode (Тип [] интерфейсы, опции ProxyGenerationOptions) Замок. DynamicProxy. DefaultProxyBuilder. CreateClassProxy (Вводят classToProxy, Тип [] additionalInterfacesToProxy, опции ProxyGenerationOptions), Замок. DynamicProxy. ProxyGenerator. CreateClassProxyType (Вводят classToProxy, Тип [] additionalInterfacesToProxy, опции ProxyGenerationOptions), Замок. DynamicProxy. ProxyGenerator. CreateClassProxy (Вводят classToProxy, Тип [] additionalInterfacesToProxy, опции ProxyGenerationOptions, Объект [] constructorArguments, IInterceptor [] перехватчики), Замок. DynamicProxy. ProxyGenerator. CreateClassProxy (Вводят classToProxy, Тип [] additionalInterfacesToProxy, опции ProxyGenerationOptions, IInterceptor [] перехватчики), Замок. DynamicProxy. ProxyGenerator. CreateClassProxy (Вводят classToProxy, Тип [] additionalInterfacesToProxy, IInterceptor [] перехватчики), Moq. Насмешка1.<InitializeInstance>b__0() Moq.PexProtector.Invoke(Action action) Moq.Mock1. InitializeInstance ()

Как я могу работать вокруг этого?

27
задан Nkosi 10 November 2016 в 11:21
поделиться

3 ответа

Вы не можете высмеять тип, у которого нет публичного конструктора, потому что Moq не сможет создать объект этого типа. В зависимости от того, что вы пытаетесь протестировать, у вас есть несколько вариантов:

  1. Если есть объект фабрики или другой способ получения экземпляров FullEnumerationContext, возможно, вы можете использовать его (извините, я не знаком с sync framework)
  2. Вы можете использовать приватную рефлексию для создания FullEnumerationContext, но тогда вы не сможете насмехаться над его методами.
  3. Вы можете ввести интерфейс и/или объект-обертку, который можно высмеивать и который может вызывать тестируемый код. Реализация во время выполнения будет делегировать реальному FullEnumerationContext, а ваша реализация во время тестирования будет выполнять любые действия, которые вам нужны.
20
ответ дан 28 November 2019 в 05:44
поделиться

Я не особо разбираюсь в Moq, но думаю, вам нужно указать аргументы для конструктора. В Rhino Mocks вы должны указать их так:

var fullEnumerationContextMock = new Mock<FullEnumerationContext>(arg1, arg2);

Вероятно, это похоже на Moq.

5
ответ дан 28 November 2019 в 05:44
поделиться

На основании ответов от marcind я создал интерфейс ( IFullEnumerationContext ), который я имитирую, а затем у меня есть две перегрузки метод, который я пытаюсь протестировать, один из которых принимает FullEnumerationContext , а другой - IFullEnumerationContext . Это не очень хорошо, но работает. Приветствуются любые лучшие предложения или улучшения.

public override void EnumerateItems(FullEnumerationContext context)
{
    List<ItemFieldDictionary> listItemFieldDictionary = EnumerateItemsCommon();
    context.ReportItems(listItemFieldDictionary);
}

public void EnumerateItems(IFullEnumerationContext context)
{
    List<ItemFieldDictionary> listItemFieldDictionary = EnumerateItemsCommon();
    context.ReportItems(listItemFieldDictionary);
}
2
ответ дан 28 November 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: