塑造一种类型,保持特定方法的原始行为

时间:2011-05-17 10:03:45

标签: c# .net unit-testing moles pex-and-moles

我正在使用Microsoft Moles并对以下主题感到好奇:

  • 有没有办法设置行为 一种类型(例如,未实现)但是 保持原来的行为 单一的具体方法?

我的目的是从其类中完全隔离要测试的方法(不知道从测试方法中调用的方法)。


以下代码对我不起作用,因为完全禁用了痣,并且任何使用过的子方法都使用其原始行为:

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

2 个答案:

答案 0 :(得分:0)

我猜你只能用stub来实现这种行为。

这是一个代码示例。我们将调用MethodToTestClassUnderTest的所有其他方法都会抛出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();
}

答案 1 :(得分:0)

可以为所有或特定的Mole实例保留原始行为。 Fallthrough行为会禁用未注册方法的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