Для моих тестов модулей Я в настоящее время издевательски перехватываю и перехватываю классы с помощью Moq, а затем регистрирует перехваченный экземпляр в Unity и устанавливает перехватчик по умолчанию для интерфейса. Затем я разрешаю методы экземпляра и вызова для перехваченного и проверяю, что вызывается метод перехвата.Регистрировать экземпляр для перехвата в Unity
_mockInterceptor = new Mock<ExternalInterceptor>().As<IInterceptRelay>();
_mockInterception = new Mock<TestInterception> { CallBase = true }.As<IInterceptRelay>();
Container.RegisterInstance(_mockInterception.Object as ITestInterception);
UnityContainer.Configure<Interception>().SetDefaultInterceptorFor<ITestInterception>(new InterfaceInterceptor());
var test = Container.Resolve<ITestInterception>();
var returnValue = test.TestTheExternalInterception(TestMessage);
_mockInterceptor.Verify(i => i.ExecuteAfter(It.IsAny<object>(), It.IsAny<IEnumerable>(), It.IsAny<LoggingInterceptionAttribute>(), It.IsAny<IMethodResult>()), Times.Once());
Это прекрасно работает, однако я предпочел бы установить перехват во время регистрации, как я делаю, когда зарегистрировать сервис/синглтон, чтобы держать все последовательно.
// Typical registration
UnityContainer.RegisterType<TFrom, TTo>(new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<PolicyInjectionBehavior>());
// Singleton registration
UnityContainer.RegisterType<TFrom, TTo>(new ContainerControlledLifetimeManager(), new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<PolicyInjectionBehavior>());
я не могу видеть способ настройки перехвата с использованием метода IUnityContainer.RegisterInstance()
, как он не принимает никакого InjectionMembers
. Я могу фактически использовать перехват с экземпляром, если я позвоню UnityContainer.Configure<Interception>().SetDefaultInterceptorFor<T>()
перед тем, как разрешить.
Есть ли лучший/более простой способ регистрации или издевательства над перехватчиком?
Что вы пытаетесь проверить здесь? Вам не нужны какие-либо издевки, потому что ваши модульные тесты не должны проверять, что Unity может выполнять перехват. Я бы даже утверждал, что вы не должны использовать Unity в своих модульных тестах (просто новый класс, который вы тестируете). Было бы так же эффективно использовать отражение, чтобы определить, присутствует ли атрибут LoggingInterception в тестируемом элементе. – TylerOhlsen
@TylerOhlsen В типичных случаях это верно, однако я использую абстрактную структуру IoC, которая позволяет исключить любой контейнер IoC вместо Unity. В этих случаях я выполняю те же тесты со всеми выбранными мной платформами IoC, которые поддерживают перехват, и тестируя, что абстракция работает должным образом. –