модульный тест консоли - PullRequest
2 голосов
/ 30 июля 2010

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

// System.Diagnostics.Debug.WriteLine(msg);

Какой более чистый способ сделать это?

Cheers,
Berryl

=== РЕДАКТИРОВАТЬ

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

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

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

    [Test]
    public void WhenThePropertyIsChanged_IfDuplicateIsFound_DuplicateNameIsPartOfBrokenRuleMessage()
    {
        const string newName = "Blah";
        // force a duplicate
        _dao.Stub(x => x.FindByName(newName)).Return(new Department(newName)); 

        var vm = _masterVm.Departments.Last();

        vm.Name = newName;
        var msg = vm.GetBrokenRules().First().Description;
        Log.Service.WriteLine(msg); <=== print it
        Assert.That(msg, Is.StringContaining(newName));
        Assert.That(vm.BrokenRules.First().Description, Is.EqualTo(msg));
    }

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

Оберните ваши операторы регистрации в сервис и код для интерфейса.

public interface ILoggingService
{
    void WriteLine(String msg);
}

Создайте статический класс, который разрешает доступ к службе ведения журнала, но позволяет настроить службу.

internal static class Log
{
    private static ILoggingService _loggingService;
    internal static ILoggingService Service
    {
        get{ return _loggingService ?? (_loggingService = new DefaultLoggingService()); }
        set{ _loggingService = value; }
    }
}

Теперь вы можете реализовать службу только в ваших тестах, которые записывают в поток отладки.

public class DebugLoggingService: ILoggingService
{
    public void WriteLine(String msg)
    {
        System.Diagnostics.Debug.WriteLine(msg);
    }
}

Log.Service = new DebugLoggingService();

Ваш код может остаться прежним, и вам нужно только изменить свой DebugLoggingService, закомментировав там строки Или, что еще лучше, вы можете заключить это в #if DEBUG ... #endif выражение.

1 голос
/ 30 июля 2010

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

Если у вас нет настоящих модульных тестов, и вы тестируете вручную, вы можете использовать Log4 , чтобы вы могли легко настроить необходимый уровень трассировки.

...