Прокси класса Castle для модульных тестов

Почесываю в голове, как это сделать.

Предположим, у меня есть конкретный класс Foo с двумя виртуальными методами, Execute() и GetFile(). Execute() позвонит GetFile. Я хочу убедиться, что когда это произойдет, GetFile() вызовет несколько разных исключений, которые Foo должны обрабатывать изящно и проверяемым образом.

Для своих модульных тестов я представляю создание экземпляра DynamicProxy ‹Foo> из проекта замка, где я перехватываю GetFile(), чтобы выбросить исключение, а затем вызываю метод Execute() объекта DynamicProxy и проверяю результаты, но я не вижу, как это сделать. это.

Это возможно / практично? Если да, то как будет выглядеть создание динамического прокси-объекта?


person Jeremy Holovacs    schedule 26.04.2012    source источник


Ответы (1)


Вам не нужно вручную кодировать собственный прокси, потому что большинство фреймворков для фиксации поддерживают ваш сценарий.

Вот пример использования Moq (Moq создаст для вас динамический прокси) :

public class SomeException : Exception { }

public class Foo
{
    public virtual int Execute()
    {
        try
        {
            GetFiles();
        }
        catch (SomeException)
        {
            return 1;
        }
        return 0;
    }

    public virtual void GetFiles()
    {
        //...
    }
}

[Test]
public void FooTest()
{
    var fooUnderTest = new Mock<Foo>();
    fooUnderTest.CallBase = true;
    fooUnderTest.Setup(f => f.GetFiles()).Throws(new SomeException());
    var result = fooUnderTest.Object.Execute();
    Assert.AreEqual(1, result);
}

Вам просто нужно установить Callbase = true, который:

Вызвать реализацию базового класса, если никакое ожидание не переопределяет член (также известный как «Частичные имитации» в Rhino Mocks): по умолчанию - false.

person nemesv    schedule 26.04.2012
comment
Выдающийся. Именно то, что я искал. - person Jeremy Holovacs; 26.04.2012