2013-11-12 2 views
0

У меня есть следующий тест:Почему реальный код вызывается в этом тесте с помощью RhinoMocks?

IUnityContainer unityContainer = MockRepository.GenerateStrictMock<IUnityContainer>(); 

unityContainer.Expect(c => c.IsRegistered<IServiceContainerRegistrar>()).Return(true).Repeat.Once(); 

Насколько я знаю, я создаю макет в IUnityContainer и я говорю ему, что вернется, когда кто-то вызывает метод IsRegistered.

Я получаю следующее исключение:

Test method CommonInitializerTest.CommonInitializer_Initialize_WorksOnce threw exception: 
System.InvalidOperationException: Previous method 'IEnumerator.MoveNext();' requires a return value or an exception to throw. 

Со следующим StackTrace:

at System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source) 
at Microsoft.Practices.Unity.UnityContainerExtensions.IsRegistered(IUnityContainer container, Type typeToCheck, String nameToCheck) 
at Microsoft.Practices.Unity.UnityContainerExtensions.IsRegistered(IUnityContainer container, Type typeToCheck) 
at Microsoft.Practices.Unity.UnityContainerExtensions.IsRegistered(IUnityContainer container) 
at Drives.Services.Common.Tests.CommonInitializerTest.<CommonInitializer_Initialize_WorksOnce>b__0(IUnityContainer c) in CommonInitializerTest.cs: line 50 
at Rhino.Mocks.RhinoMocksExtensions.Expect(T mock, Function`2 action) 

Так Ожидать называет реальный код и как я не издевались все, что используется Единство - это неудача. Почему RhinoMock выполняет реальный код при регистрации ожидания?

+0

Как вы назначаете контейнер с обрезанными единицами в тестируемую систему. Можете ли вы предоставить больше кода в своем модульном тесте, очевидно, скрываете любую вещь, которую вы не должны публиковать? Также просто проверьте, действительно ли isRegistered действительно насмешливо. Возможно, это статический метод ext, который не является макетным. – Spock

+0

Вам нужно, чтобы вы опубликовали свой метод расширения. Похоже, какой-то код внутри использует выражение linq против вашего издевающегося контейнера. – TheCodeKing

+0

@Raj: Возможно, вы написали решение. Как это метод расширения, может быть, его нельзя издеваться? –

ответ

1

Насколько я знаю, нет встроенного способа для создания статического метода расширения. Это правда с Moq, и я полагаю, что для RhinoMock. Конечно, вы можете создавать обертки и т. Д., Но я не думаю, что есть встроенный способ. Вероятно, поэтому ваш код, поражающий реальный метод расширения, даже через него, был пробит.

public static bool IsRegistered<T>(this IUnityContainer container) 
{ 
    Guard.ArgumentNotNull((object) container, "container"); 
    return UnityContainerExtensions.IsRegistered(container, typeof (T)); 
} 

См. Также relevant должность.

Смежные вопросы