1

Для моих тестов модулей Я в настоящее время издевательски перехватываю и перехватываю классы с помощью 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>() перед тем, как разрешить.

Есть ли лучший/более простой способ регистрации или издевательства над перехватчиком?

+0

Что вы пытаетесь проверить здесь? Вам не нужны какие-либо издевки, потому что ваши модульные тесты не должны проверять, что Unity может выполнять перехват. Я бы даже утверждал, что вы не должны использовать Unity в своих модульных тестах (просто новый класс, который вы тестируете). Было бы так же эффективно использовать отражение, чтобы определить, присутствует ли атрибут LoggingInterception в тестируемом элементе. – TylerOhlsen

+0

@TylerOhlsen В типичных случаях это верно, однако я использую абстрактную структуру IoC, которая позволяет исключить любой контейнер IoC вместо Unity. В этих случаях я выполняю те же тесты со всеми выбранными мной платформами IoC, которые поддерживают перехват, и тестируя, что абстракция работает должным образом. –

ответ

5

Unity Interception предлагает создавать прокси без разрешения их на единицу. Затем вы можете создать RegisterInstance объект, который вы создали сами.

Для получения дополнительной информации см. Dependency Injection with Unity стр. 77 «Перехват без контейнера Единства».

Я взял следующий пример из here:

ITenantStore tenantStore = Intercept.ThroughProxy<ITenantStore>(
    new TenantStore(tenantContainer, blobContainer), 
    new InterfaceInterceptor(), 
    new IInterceptionBehavior[] 
    { 
     new LoggingInterceptionBehavior(), 
     new CachingInterceptionBehavior() 
    }); 
+0

Спасибо, все будет хорошо. –

+0

Что делать, если объект уже создан к тому моменту, когда вы сюда попали? – claudekennilol

+0

@claudekennilol какой предмет? «TenantStore»? Просто замените «новый TenantStore (tenantContainer, blobContainer)» ссылкой на существующий объект ... – BatteryBackupUnit