Я пытаюсь дразнить класс от 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.Mock
1. InitializeInstance ()
Как я могу работать вокруг этого?
Вы не можете высмеять тип, у которого нет публичного конструктора, потому что Moq не сможет создать объект этого типа. В зависимости от того, что вы пытаетесь протестировать, у вас есть несколько вариантов:
Я не особо разбираюсь в Moq, но думаю, вам нужно указать аргументы для конструктора. В Rhino Mocks вы должны указать их так:
var fullEnumerationContextMock = new Mock<FullEnumerationContext>(arg1, arg2);
Вероятно, это похоже на Moq.
На основании ответов от 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);
}