Перемешивание EventLog и EventLogEntry - PullRequest
4 голосов
/ 30 июля 2010

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

Мой вопрос: есть ли способы насмешки над EventLog, чтобы иметь возможность вернуть EventLogEntries. Необходимость записи записей в фактический EventLog для меня больше напоминает интеграционное тестирование, чем модульное тестирование.

Ответы [ 3 ]

3 голосов
/ 01 августа 2010

Это похоже на другой вопрос, на который я только что ответил сегодня - Как выполнить модульное тестирование сохранения файла на диск?

Единственное отличие в том, что ваши зависимости - это EventLog и связанные классы. Давайте предположим, что вам просто нужно записать какой-то текст с серьезностью.

struct Event 
{ 
  public string Description {get; set;} 
  public Severity Severity {get; set;}
}

interface Logger
{
  void WriteEvent(Event e);
  void IEnumerable<Event> GetEvents();
}

Теперь, так как EventLog - это класс .Net, который нельзя привести к интерфейсу Logger, вам понадобится адаптер

public EventLogAdapter : Logger {
 //delegates to .Net framework's EventLog  
 // Also EventLogEntry is internal to this class - entries will be mapped to Event structs
}

Теперь все, что нам нужно, это тесты ... просто как МАУ или 123

  • Модульные тесты для классов, которые зависят от Logger, будут использовать макет.
  • Написание интеграционных тестов для проверки того, что API для EventLogAdapter действительно записывает данные и читает из Windows EventLog
  • Напишите, по крайней мере, один приемочный тест, который проверяет сквозной сценарий, который вызывает некоторую регистрацию, т.е. проверяет, правильно ли подключен EventLogAdapter.
1 голос
/ 30 июля 2010

Здесь действительно полезны интерфейсы. Пусть ваш класс полагается на IEventLog вместо EventLog. Затем в своих тестах вы можете смоделировать IEventLog и убедиться, что методы, которые вы ожидаете вызвать в IEventLog, действительно вызываются.

Если вы хотите вставить рекордер в ваш класс, чтобы захватить все (class EventLogRecorder : IEventLog), вы можете сделать это тоже ... и делать все, что вам нужно.

Слабое сцепление - это то место, куда вы хотите попасть ...

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

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

TDD привел меня на путь изоляции и издевательства над многими вещами, которые кажутся странными, чтобы насмехаться, но в итоге они спасли меня от кошмаров, связанных с обслуживанием позже. т.е. файл IO, ведение журнала, трассировка и т. д. *

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...