2011-05-17 6 views
0

Я использую Microsoft Родинки и любопытно на следующую тему:
Moling типа, сохраняя оригинальное поведение конкретного метода

  • Есть ли способ, чтобы установить поведение от типа (например, к нереализованному), но сохранить исходное поведение одного конкретного метода ?

Мое намерение состоит в том, чтобы полностью изолировать метод для проверки (не зная методов, вызванных методом тестирования) из своего класса.


Следующий код не работает для меня, как моль отключается полностью и любой используемый submethod использует свое первоначальное поведение:

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

ответ

0

Я думаю, вы можете использовать только заглушки для достижения такого поведения.

Вот пример кода. Мы будем называть MethodToTest, все остальные методы ClassUnderTest выдадут исключение типа BehaviorNotImplementedException.

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

Родинки генерирует класс заглушки для нас под названием 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(); 
} 
0

Исходное поведение может быть сохранено для всех или конкретных экземпляров Mole. Поведение Fallout отключает 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