Формирование типа, сохранение исходного поведения определенного метода - PullRequest
0 голосов
/ 17 мая 2011

Я использую Microsoft Moles и мне интересно следующее:

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

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

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

Ответы [ 2 ]

0 голосов
/ 08 июня 2011

Исходное поведение может быть сохранено для всех или определенных экземпляров Mole. Поведение Fallthrough отключает кроты для незарегистрированных методов.

// 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

0 голосов
/ 07 июня 2011

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

Вот пример кода. Мы вызовем 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();
}
...