有没有人试过这个?
我喜欢最小起订量,我喜欢 pex 正在做的事情,但没有一起尝试过。在我认为的大多数情况下,我更喜欢使用 moq 而不是痣,但我很想知道是否有人遇到了障碍?
他们玩得好吗?
虽然没试过,Pex和Moq应该像老朋友一样相处。
虽然 Pex 和 Moq 之间的拦截技术不同(Pex 使用 ProfilerAPI 来解释 MSIL 指令;Moq 使用 DynamicProxy 来动态派生类),但 Moq 源代码中的引用表明它旨在防止 Pex 会出现的重入问题干扰起订量。
根据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();
}
}
}
我没有让 pex amd moq 工作得很好,尽管那是很久以前的事了。Pex 似乎迷失在 Moq 创建的 Reflection.Emit / 动态代理内容中。
如果您需要与 pex 一起进行模拟,我建议您查看 Moles。它是一个非常好的模拟框架,并且已经与 pex 捆绑在一起