5

我想测试一个类是否有一个分配给事件的 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

4 回答 4

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

然后您可以使用 prop 访问已注册的处理程序PersonEventHandlers

你能实现这样的东西吗?

于 2009-01-07T13:26:26.223 回答
1

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

于 2009-01-07T11:47:01.463 回答
0

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

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

于 2009-01-07T11:34:16.683 回答
0

这不是真正的单元测试,而是集成测试。而且我不是在测试温莎城堡,而是我的配置。我正在测试我所有的解耦类是否按照我的意图连接起来。

最终,我想测试我的配置是否正确连接了我想要的事件,但我不确定 C# 是否会让我不改变我的 API,如 Yuval 所说。

于 2009-01-07T11:56:19.527 回答