0

私は Microsoft Moles を使用しており、次のトピックに興味があります。

  • 型の動作を設定する方法はありますか (たとえば、未実装に)、単一の特定のメソッドの元の動作を維持する方法はありますか?

私の意図は、(テストするメソッドから呼び出されるメソッドを知らずに) テストするメソッドをそのクラスから完全に分離することです。


ほくろが完全に無効になっており、使用されているサブメソッドは元の動作を使用しているため、次のコードは機能しません。

MBaseObjectType.BehaveAsNotImplemented();
MolesContext.ExecuteWithoutMoles(() => mBaseObject.MethodToTest())
4

2 に答える 2

0

元の動作は、すべてまたは特定の Mole インスタンスに対して保持される場合があります。フォールスルー動作は、登録されていないメソッドの Moles を無効にします。

// All instances:
MFileWatcher.Behavior = MoleBehaviors.Fallthrough;

// Specific instance
var original = new BaseObjectType(null);
var moledInstance = new MBaseObjectType(original) { InstanceBehavior = MoleBehaviors.Fallthrough };

参照: http://social.msdn.microsoft.com/Forums/en-US/pex/thread/39af5a02-1cc9-4cf3-a254-3bdc923175db

于 2011-06-08T17:59:04.357 に答える
0

この動作を実現するには、スタブしか使用できないと思います。

これがコードサンプルです。を呼び出しますMethodToTest。他のすべてのメソッドはClassUnderTest、タイプ の例外をスローしますBehaviorNotImplementedException

public class ClassUnderTest
{
    public virtual void MethodToTest()
    {
        Debug.WriteLine("In MethodToTest");
        AnotherMethod();
    }
    public virtual void AnotherMethod()
    {
        Debug.WriteLine("In AnotherMethod");
    }
}

Moles は と呼ばれるスタブ クラスを生成し、SClassUnderTestこれを使用して を呼び出しますMethodToTest

public void Test1()
{
    // A hack to call an overridden method.
    var mi = typeof(ClassUnderTest).GetMethod("MethodToTest");
    DynamicMethod dm = new DynamicMethod(
        "BaseMethodToTest",
        null,
        new Type[] { typeof(SClassUnderTest) },
        typeof(SClassUnderTest));
    ILGenerator gen = dm.GetILGenerator();
    gen.Emit(OpCodes.Ldarg_1);
    gen.Emit(OpCodes.Call, mi);
    gen.Emit(OpCodes.Ret);
    var baseMethodCall = (Action<SClassUnderTest>)dm.CreateDelegate(
        typeof(Action<SClassUnderTest>));

    // Arrange the stub.
    SClassUnderTest stub = new SClassUnderTest();
    stub.InstanceBehavior = BehavedBehaviors.NotImplemented;
    stub.MethodToTest01 = () =>
    {
        baseMethodCall(stub);
    };

    // Act.
    stub.MethodToTest();
}
于 2011-06-07T19:18:15.080 に答える