【问题标题】:xUnit: how to Assert other event of types then EventHandler<EventArgs>xUnit:如何断言其他类型的事件然后 EventHandler<EventArgs>
【发布时间】:2018-10-23 19:52:31
【问题描述】:

我是单元测试的初学者,我已经在网上搜索了几个小时,但仍然找不到我的简单问题的答案。

我有一堂课有以下事件:

event Action<ITagData> OnTagHandled

现在我想编写一个单元测试来断言事件是否已引发,但是当我编写如下内容时:

Assert.Raises<EventArgs>(handler => m_rssiHander.OnTagHandled += handler,
    handler => m_rssiHander.OnTagHandled -= handler, () => { });

我收到如下错误:

无法将 System.EventHandler 类型隐式转换为 System.Action

谁能告诉我如何断言Action&lt;T&gt; 类型的事件?

【问题讨论】:

    标签: c# unit-testing xunit


    【解决方案1】:

    这是因为handlerEventHandler&lt;EventArgs&gt; 的类型 所以m_rssiHander.OnTagHandled += handler 不起作用

    你将不得不改变: event Action&lt;ITagData&gt; OnTagHandled

    event Action&lt;EventArgs&gt; OnTagHandled 让它工作 或 EventArgs 的任何子类并继承 ITagData 接口

    例如

    class TagDataEventArgs: EventArgs, ITagData {}
    

    并将其用作: event Action&lt;TagDataEventArgs&gt; OnTagHandled

    AND 断言:

    Assert.Raises<TagDataEventArgs>(handler => m_rssiHander.OnTagHandled += handler,
            handler => m_rssiHander.OnTagHandled -= handler, () => { });
    

    【讨论】:

    • 感谢您的回答,但您的解决方案将导致大量重构,因为我们的代码中继承层次结构很复杂,并且由于单元测试框架的限制,我不想重构整个代码。
    【解决方案2】:

    最后我决定这样做:

     bool wasEventRaised = false;
     m_rssiHandler.OnTagHandled += data => { wasEventRaised = true;};
    
     // Act
     m_rssiHandler.ProcessTag(m_tag);
    
     // Assert
     Assert.True(wasEventRaised);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2023-04-03
      相关资源
      最近更新 更多