Проверка того, что событию присвоен EventHandler - PullRequest
5 голосов
/ 07 января 2009

Я хочу проверить, что у класса есть 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 имеет к нему что-либо.

Есть идеи?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 07 января 2009

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

См. Этот пример:

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.

Можете ли вы реализовать что-то подобное?

1 голос
/ 07 января 2009

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

0 голосов
/ 07 января 2009

Это на самом деле не модульное тестирование, это интеграционный тест. И я не тестирую Касл Виндзор, а скорее мою конфигурацию. Я проверяю, что все мои разъединенные классы подключаются так, как я собираюсь.

В конечном счете, я хочу проверить, правильно ли моя конфигурация перехватывает события так, как я хочу, но я не уверен, что C # позволит мне без изменения моего API, как говорит Ювал.

0 голосов
/ 07 января 2009

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

Если вы должны это проверить, похоже, вам нужно открыть публичный API в IChangePersonService, чтобы получить зарегистрированные обработчики событий.

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