Pex和Moq能很好地协同工作吗?

4

有人试过这个吗?

我喜欢moq,也喜欢pex的功能,但还没有尝试过它们一起使用。我认为在大多数情况下,我更愿意使用moq而不是moles,但我很好奇是否有人遇到了障碍?

它们能够很好地协作吗?


1
可能是Integrate Pex with MoQ的重复问题。 - John Nicholas
2个回答

2

虽然我没有尝试过,但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();
        }
    }
 }

它们的结果是它们能够很好地协同工作。 - John Nicholas

0

我以前没有很好地让pex和moq一起工作,尽管那是很久以前的事情。Pex似乎在Reflection.Emit /动态代理方面与moq创建的内容混淆了。

如果您需要与pex一起进行模拟,我建议看看Moles。它是一个相当不错的模拟框架,并已经与pex捆绑在一起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接