誰もこれを試しましたか?
私はmoqが好きで、pexがしていることは好きですが、一緒に試したことはありません. ほとんどの場合、ほくろよりもmoqを使用したいと思いますが、誰かが障害にぶつかったかどうかを知りたいですか?
彼らはいいプレーをしますか?
私は試していませんが、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();
}
}
}
それはずっと前のことですが、私はpexとmoqをうまく連携させることができませんでした。Pex は、moq が作成する Reflection.Emit / 動的プロキシのもので迷子になったようです。
pex と組み合わせてモックを作成する必要がある場合は、Moles を参照することをお勧めします。全体的に非常に優れたモッキング フレームワークであり、既に pex にバンドルされています。