J'ai une classe de test .net. Dans la méthode Initialize, je crée un conteneur Windsor et effectue des enregistrements. Dans la méthode de test actuelle, j'appelle une méthode sur la classe de contrôleur mais l'intercepteur ne fonctionne pas et la méthode est appelée directement. Quelles sont les raisons potentielles de cela?L'intercepteur Castle n'intercepte pas de méthode sur un contrôleur MVC pendant le test unitaire
est ici tout le code connexe:
Test.cs:
private SomeController _someController;
[TestInitialize]
public void Initialize()
{
Container.Register(Component.For<SomeInterceptor>());
Container.Register(
Component.For<SomeController>()
.ImplementedBy<SomeController>()
.Interceptors(InterceptorReference.ForType<SomeInterceptor>())
.SelectedWith(new DefaultInterceptorSelector())
.Anywhere);
_someController = Container.Resolve<SomeController>();
}
[TestMethod]
public void Should_Do_Something()
{
_someController.SomeMethod(new SomeParameter());
}
SomeController.cs:
[HttpPost]
public JsonResult SomeMethod(SomeParameter parameter)
{
throw new Exception("Hello");
}
SomeInterceptor.cs:
public class SomeInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// This does not gets called in test but gets called in production
try
{
invocation.Proceed();
}
catch
{
invocation.ReturnValue = new SomeClass();
}
}
}
DefaultInterceptorSelector. cs:
public class DefaultInterceptorSelector : IInterceptorSelector
{
public IInterceptor[] SelectInterceptors(Type type, MethodInfo method, IInterceptor[] interceptors)
{
return
method.ReturnType == typeof(JsonResult)
? interceptors
: interceptors.Where(x => !(x is SomeInterceptor)).ToArray();
}
}
+1 J'aime la façon dont vous résolvez le problème. :) – ktutnik
Il doit être virtuel pour que le proxy puisse l'envelopper. nos autres couches fonctionnaient parce qu'ils avaient une interface spécifique que le proxy pourrait envelopper – eiu165