我正在使用Microsoft Moles并对以下主题感到好奇:
我的目的是从其类中完全隔离要测试的方法(不知道从测试方法中调用的方法)。
以下代码对我不起作用,因为完全禁用了痣,并且任何使用过的子方法都使用其原始行为:
MBaseObjectType.BehaveAsNotImplemented();
MolesContext.ExecuteWithoutMoles(() => mBaseObject.MethodToTest())
答案 0 :(得分:0)
我猜你只能用stub来实现这种行为。
这是一个代码示例。我们将调用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();
}
答案 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