单元测试 IInterceptionBehavior
Unit testing an IInterceptionBehavior
我正在尝试测试 IInterceptionBehavior
:
的实现
public class LoggingInterceptorBehavior : IInterceptionBehavior
{
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
var methodBase = input.MethodBase;
/* ... */
return getNext()(input, getNext);
}
public IEnumerable<Type> GetRequiredInterfaces() { /* ... */ }
public bool WillExecute { get { return true; } }
}
如何制作假的 MethodBase
?
诀窍似乎是,相当复杂地,使用反射获取 MethodHandle
,然后将其传递到 MethodBase
class:
之外的静态方法
var methodHandle = dummyClass.GetType().GetMethod("dummyMethod").MethodHandle;
var methodBase = MethodBase.GetMethodFromHandle(methodHandle);
这对我来说似乎是错误的。你在这里似乎需要的是一个相当集成的测试,你可以通过使用它来测试整个东西,然后检查它是否在日志中记录了一些东西(或者拦截器的目的是什么)。您可以创建一个容器,注册一个虚拟测试 class,在其上执行一个方法,让拦截器拦截该方法,等等。您得到了手势。
我正在尝试测试 IInterceptionBehavior
:
public class LoggingInterceptorBehavior : IInterceptionBehavior
{
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
var methodBase = input.MethodBase;
/* ... */
return getNext()(input, getNext);
}
public IEnumerable<Type> GetRequiredInterfaces() { /* ... */ }
public bool WillExecute { get { return true; } }
}
如何制作假的 MethodBase
?
诀窍似乎是,相当复杂地,使用反射获取 MethodHandle
,然后将其传递到 MethodBase
class:
var methodHandle = dummyClass.GetType().GetMethod("dummyMethod").MethodHandle;
var methodBase = MethodBase.GetMethodFromHandle(methodHandle);
这对我来说似乎是错误的。你在这里似乎需要的是一个相当集成的测试,你可以通过使用它来测试整个东西,然后检查它是否在日志中记录了一些东西(或者拦截器的目的是什么)。您可以创建一个容器,注册一个虚拟测试 class,在其上执行一个方法,让拦截器拦截该方法,等等。您得到了手势。