有人试过这个吗?
我喜欢moq,也喜欢pex的功能,但还没有尝试过它们一起使用。我认为在大多数情况下,我更愿意使用moq而不是moles,但我很好奇是否有人遇到了障碍?
它们能够很好地协作吗?
虽然我没有尝试过,但Pex和Moq应该像老朋友一样相处得很好。
虽然Pex和Moq之间的拦截技术不同(Pex使用ProfilerAPI来解释MSIL指令;Moq使用DynamicProxy来动态派生类),但Moq源代码中有参考信息表明其设计是为了防止重入问题,在这种情况下Pex会干扰Moq。
根据原始Pex研究论文,您可以使用属性修饰您的代码,以控制何时使用Pex重写器。
从Moq源代码中:
internal static MethodCall<T> Setup<T>(Mock mock, Expression<Action<T>> expression, Func<bool> condition) where T : class
{
return PexProtector.Invoke(() =>
{
var methodCall = expression.ToMethodCall();
var method = methodCall.Method;
var args = methodCall.Arguments.ToArray();
ThrowIfNotMember(expression, method);
ThrowIfCantOverride(expression, method);
var call = new MethodCall<T>(mock, condition, expression, method, args);
var targetInterceptor = GetInterceptor(methodCall.Object, mock);
targetInterceptor.AddCall(call, SetupKind.Other);
return call;
});
}
PexProtector被定义为:
internal sealed class __ProtectAttribute : Attribute
{
}
namespace Moq
{
[__Protect]
[DebuggerStepThrough]
internal static class PexProtector
{
public static void Invoke(Action action)
{
action();
}
public static T Invoke<T>(Func<T> function)
{
return function();
}
}
}
我以前没有很好地让pex和moq一起工作,尽管那是很久以前的事情。Pex似乎在Reflection.Emit /动态代理方面与moq创建的内容混淆了。
如果您需要与pex一起进行模拟,我建议看看Moles。它是一个相当不错的模拟框架,并已经与pex捆绑在一起。