【问题标题】:Do Pex and Moq work together nicley?Pex 和 Moq 一起工作吗?
【发布时间】:2010-12-18 14:30:43
【问题描述】:

有人试过吗?

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

他们打得好吗?

【问题讨论】:

标签: moq pex


【解决方案1】:

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

【讨论】:

  • 结果是他们在一起表现得非常好。
【解决方案2】:

我没有让 pex amd moq 很好地协同工作,尽管那是很久以前的事了。 Pex 似乎迷失在 Moq 创建的 Reflection.Emit / 动态代理内容中。

如果您需要结合 pex 进行模拟,我建议您查看 Moles。它是一个非常好的模拟框架,并且已经与 pex 捆绑在一起

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2011-02-10
    • 2012-01-17
    • 2013-07-09
    • 2016-01-29
    • 2017-02-07
    相关资源
    最近更新 更多