有没有人试过这个?
我喜欢moq,我喜欢pex正在做的事情,但没有一起尝试过。在大多数情况下,我更喜欢使用moq而不是摩尔,但我很想知道是否有人遇到过障碍?
他们玩得好吗?
答案 0 :(得分:2)
虽然我没有尝试,但Pex和Moq应该像老朋友一样相处。
虽然Pex和Moq之间的拦截技术不同(Pex使用ProfilerAPI来解释MSIL指令; Moq使用DynamicProxy来动态派生类),但Moq源代码中有一些引用表明它是为防止重入问题而设计的Pex会干扰Moq。
根据原始research paper for Pex,您可以使用控制Pex重写器何时使用的属性来装饰您的代码。
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();
}
}
}
答案 1 :(得分:0)
我没有得到pex amd moq非常好的工作,尽管那是很久以前的事了。 Pex似乎迷失在moq创建的Reflection.Emit / dynamic代理内容中。
如果你需要和pex一起做模拟,我建议你看看Moles。它是一个非常好的模拟框架,并且已经与pex
捆绑在一起