Хотя я не пробовал, Пекс и Мок должны ладить как старые друзья.
Хотя методы перехвата между Pex и Moq различны (Pex использует ProfilerAPI для интерпретации инструкций MSIL; Moq использует DynamicProxy для динамического получения классов), в исходном коде 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();
}
}
}