【问题标题】:Extension method to assert an event is raised in c#在 C# 中引发了断言事件的扩展方法
【发布时间】:2017-02-23 13:25:08
【问题描述】:

我现在正在做这个

bool didFire = false;
_viewModel.SomethingChanged = () => didFire = true;

_viewModel.SomeProperty = SomeValue;
Assert.IsTrue(didFire);

这有缺点:

  • 设置又丑又长。
  • 每次我拨打多个电话时,我都需要将didFire 重置为false 手动,例如,如果我想测试在某些情况下触发的事件,但并非总是如此,遵循某个设想。这很容易出错,因为忘记它可能会破坏测试。
  • 由于有许多事件/回调/情况,这会导致用于测试简单事件的更多样板代码。

所以就像任何体面的程序员都会做的那样,在看到自己重复相同的任务之后,我想将它存储在一个函数中。

我想出的最佳想法是将其放入 Assert 扩展方法中,但我自己或在线都找不到合适的方法来使它工作并且仍然很好。

理想情况下,我正在寻找可以如下工作的东西

Assert.WillBeRaised(_viewModel.SomethingChanged);
_viewmodel.SomeProperty = SomeValue;

或者,也许正好相反

_viewmodel.SomeProperty = SomeValue;
Assert.WasRaised(_viewModel.SomethingChanged);

这就是我的问题所在,在引发事件之前必须有人在听,并且必须在之后进行断言。所以不管怎样,我觉得我最终会写太多代码行。

有没有人为这个相当普遍的问题找到一些干净的解决方案?

【问题讨论】:

    标签: c# unit-testing events extension-methods assert


    【解决方案1】:

    您可能想看看Fluent Assertions

    有了这些,您可以执行以下操作:

    // this is the whole initialization
    _viewModel.MonitorEvents();
    
    // do test
    _viewModel.SomeProperty = SomeValue;
    
    // this is the whole assertion
    _viewModel.ShouldRaise("SomethingChanged");
    

    您可以扩展它以检查传递给事件处理程序等的参数:

    _viewModel.ShouldRaise("SomethingChanged")
              .WithSender(_viewModel)
              .WithArgs<SomethingChangedEventArgs(e => e.Name == "SomeValue");
    

    【讨论】:

      【解决方案2】:

      你可以这样写:

          public static void WillBeRaised(Action<Action> attach, Action act)
          {
              bool called = false;
              attach(() => called = true);
              act();
              Assert.IsTrue(called);
          }
      

      及用法:

         WillBeRaised(
              x => _viewmodel.SomethingChanged += x, 
              () => _viewmodel.SomeProperty = SomeValue);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 2010-10-11
        • 1970-01-01
        相关资源
        最近更新 更多