Проверка того, что событию назначен EventHandler
-
05-07-2019 - |
Вопрос
Я хочу проверить, что классу присвоен EventHandler событию.По сути, я использую свой IoC-контейнер для подключения EventHandlers для себя, и я хочу проверить, что они назначены правильно.Итак, на самом деле я тестирую свою конфигурацию IoC.
[Test]
public void create_person_event_handler_is_hooked_up_by_windsor()
{
IChangePersonService changePersonService = IoC.Resolve<IChangePersonService>();
// check that changePersonService.PersonCreated has a handler attached
}
Я не уверен, как проверить, что к ChangePersonService.PersonCreated что-то прикреплено.
Есть идеи?
Спасибо.
Решение
Не задаваясь вопросом, на что вы этим претендуете, единственный способ протестировать и подсчитать зарегистрированные события — это зарегистрировать их в своей собственной коллекции.
См. этот пример:
public class MyChangePersonService : IChangePersonService
{
private IList<EventHandler> handlers;
private EventHandler _personEvent;
public event EventHandler PersonCreated
{
add
{
_personEvent += value;
handlers.Add(value);
}
remove
{
_personEvent -= value;
handlers.Remove(value);
}
}
public IList<EventHandler> PersonEventHandlers { get { return handlers; } }
public MyChangePersonService()
{
handlers = new List<EventHandler>();
}
public void FirePersonEvent()
{
_personEvent(this, null);
}
}
Затем вы можете получить доступ к зарегистрированным обработчикам с помощью prop PersonEventHandlers
.
Можете ли вы реализовать что-то подобное?
Другие советы
Мне кажется, вы пытаетесь провести модульное тестирование Castle Windsor.Поскольку у него, вероятно, уже есть модульные тесты, я считаю, что это пустая трата усилий.Вам лучше проверить, что ваш объект вызывает соответствующие события в нужное время (возможно, зарегистрировав фиктивный объект в качестве обработчика событий).
На самом деле это не модульное тестирование, это интеграционный тест.И я тестирую не Castle Windsor, а мою его конфигурацию.Я проверяю, все ли мои несвязанные классы подключаются так, как я намереваюсь.
В конечном счете, я хочу проверить, правильно ли моя конфигурация подключает события так, как я хочу, но я не уверен, что C# позволит мне не менять мой API, как говорит Юваль.
Похоже, ты пытаешься подталкивать некоторую информацию из вашего объекта, чтобы утверждать это то или иное.Обратите внимание: это не обязательно модульное тестирование, поскольку вы не тестируете функциональность.
Если вам нужно это протестировать, похоже, вам нужно будет открыть общедоступный API в IChangePersonService
чтобы получить зарегистрированные обработчики событий.