2010-07-30 7 views
2

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

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

Что такое уборщик способ сделать это?

Приветствия,
Berryl

=== EDIT

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

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

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

[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

Оберните свои заявления о регистрации в службу и код в интерфейс.

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.

+0

Pretty slick. Если бы вы использовали Log4Net в любом случае, вы бы все равно выполняли эту услугу или Log4Net это делали? – Berryl

+1

@Berryl - Я обычно придерживаюсь даже моего стороннего материала за границей интерфейса, поэтому я не получаю «рамки» заблокирован. Я использую Entlib для регистрации, но я все еще использую границы служб, как указано выше. Таким образом, если я когда-либо захочу поменять свою систему ведения журналов на что-то еще, то могу. – Josh

1

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

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

+0

Это не было бы единичным тестом без утверждения; я говорю о тонкой настройке типа, которая иногда полезна в * добавлении * к утверждению. – Berryl

+0

@Berryl: согласен, но не все используют термин единичного тестирования для одной и той же вещи. Мне показалось, что вы не можете писать автоматические тесты, поэтому мой комментарий.
Это, как говорится, обычно не требуется для печати. У вас есть они в вашем коде или в ваших тестах? Те, кто в тестах, окончательно преобразуются в утверждения.
Тем не менее, Log4j или любой другой совет остается. – philant

+0

@phillipe. См. Редактирование в конце исходного сообщения, чтобы понять мотивацию печати и образец теста. Общий процент модульных тестов, которые заслуживают печати, очень мал. Если бы я знал log4net хорошо, я, вероятно, использовал бы его каким-то образом, но предложение Джоша - это определенное обновление по сравнению с тем, что я делал раньше. ура – Berryl