c #: Как я могу проверить, что методы вызываются в определенном порядке? - PullRequest
2 голосов
/ 02 октября 2009

У меня есть следующий класс:

public class Script
{
    IPrinter _printer;

    public Script(IPrinter printer)
    {
        _printer = printer;
    }

    public void Print(TextWriter writer)
    {
        _printer.PrintComment(writer, "lolz");
        writer.WriteLine("omg this complicates things";
        _printer.PrintSpecial(writer);
        if (signoff)
            _printer.PrintComment(writer, "kthxbye");
    }
}

Как мне настроить тест, чтобы утверждать, что методы принтера вызываются в правильном порядке с правильными параметрами?

Я мог бы вручную создать «фальшивый» принтер и выполнить тест состояния на писателе, но поскольку контекст большой (особенно если скрипт также работает с писателем), я бы хотел этого избежать.

Я использую монахиню и носорога. Мы будем благодарны за любые мысли об архитектурных изменениях или процедурах насмешек, чтобы облегчить тестирование. Реальный код, с которым я работаю, к сожалению, более сложный - но это суть.

Ответы [ 3 ]

5 голосов
/ 02 октября 2009

Вы не можете использовать статический синтаксис AAA для проверки поведения в Rhino, к сожалению, вы должны вернуться к старому стилю "Replay", чтобы сделать это AFAIK.

Я не эксперт по носорогам, я обычно использую Moq, но я думаю, что это правильно:

var mocks = new MockRepository();
var printer = mocks.DynamicMock<IPrinter>();
using (mocks.Ordered())
{
    printer.Expect(x => x.PrintComment());
    printer.Expect(x => x.PrintSpecial());
    printer.Expect(x => x.PrintComment());
}
printer.Replay();
Script = new Script(printer);

... Execute Test...

printer.VerifyAllExpectations();
3 голосов
/ 02 октября 2009

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

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

0 голосов
/ 02 октября 2009

Вам не нужно проверять компилятор. Если бы вы занимались каким-то потоком, я мог бы это увидеть ... но в этом случае с тем, что вы опубликовали, это не так.

Как вы сказали, вы можете создать макет принтера и проверить, что методы вызываются по порядку, но это будет избыточно.

Вероятно, было бы лучше создавать исключения в конкретных методах, если предварительные условия (т.е. предыдущие методы) не вызываются, но это намекает на необходимость рефакторинга в один метод.

Кроме того, вы можете использовать шаблон шаблона метода , чтобы гарантировать, что методы вызываются по порядку, но если у вас не будет дополнительных объектов, которым потребуется использовать это упорядочение, это будет излишество.

...