Pex和Moq一起工作吗?

时间:2010-12-18 14:30:44

标签: moq pex

有没有人试过这个?

我喜欢moq,我喜欢pex正在做的事情,但没有一起尝试过。在大多数情况下,我更喜欢使用moq而不是摩尔,但我很想知道是否有人遇到过障碍?

他们玩得好吗?

2 个答案:

答案 0 :(得分:2)

虽然我没有尝试,但Pex和Moq应该像老朋友一样相处。

虽然Pex和Moq之间的拦截技术不同(Pex使用ProfilerAPI来解释MSIL指令; Moq使用DynamicProxy来动态派生类),但Moq源代码中有一些引用表明它是为防止重入问题而设计的Pex会干扰Moq。

根据原始research paper for Pex,您可以使用控制Pex重写器何时使用的属性来装饰您的代码。

来自Moq source code

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

捆绑在一起