测试事件是否已分配EventHandler

时间:2009-01-07 11:30:36

标签: c# unit-testing events event-handling

我想测试一个类有一个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 个答案:

答案 0 :(得分:2)

不要质疑你假装的是什么,测试和枚举注册事件的唯一方法就是你在自己的收藏中注册它们。

见这个例子:

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);
    }
}

然后,您可以使用道具PersonEventHandlers访问已注册的处理程序。

你能实现这样的东西吗?

答案 1 :(得分:1)

在我看来,你正试图对温莎城堡进行单元测试。由于它可能已经进行了单元测试,我认为这是浪费精力。你最好测试你的对象在正确的时间引发适当的事件(可能通过将模拟对象注册为事件处理程序)。

答案 2 :(得分:0)

听起来你正试图从你的对象中 prod 一些信息,以便断言它是一回事。请注意,这不一定是单元测试,因为您没有测试功能。

如果您必须对此进行测试,您似乎需要在IChangePersonService中打开公共API才能获取已注册的事件处理程序。

答案 3 :(得分:0)

它不是真正的单元测试,它是一个集成测试。我不是在测试Castle Windsor,而是测试它的配置。我正在测试我所有的解耦类都按照我的意图连接起来。

最终,我想测试我的配置是否按照我的意愿正确地连接事件,但我不确定C#会让我在不改变我的API的情况下如Yuval所说。