4

有没有人试过这个?

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

他们玩得好吗?

4

2 回答 2

2

虽然没试过,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();
        }
    }
 }
于 2011-02-12T01:36:16.410 回答
0

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

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

于 2011-05-02T21:45:07.510 回答