NUnit断言事件。有什么建议吗?

3

想知道测试结果与事件的正确方式是否正确。

我正在开发一个应用程序,在保存进行中/完成时会触发事件。

为了测试它,我想出了以下(虚构的场景)。 我想知道这是否是您所做的方式:

[Test]
public void Save_WhenCalled_IsSuccessfull()
{
    //Arrange
    var customerService= new CustomerService();

    customerService.OnSaved += (sender, args) =>
        {                                             
            Assert.IsTrue(args.HasSaved);
        };

    customerService.Save(new Customer {Id=1,Name="Jo"});
}

我不喜欢的是,如果你知道我的意思,我会在断言之前进行断言。

我希望这个断言能够在视觉上放在最后。顺便说一下,上面的代码可以正常工作,但我还不是很满意。

有什么建议吗?


你看过这个吗?-> https://dev59.com/4HVC5IYBdhLWcg3wliGe - Dimitar Dimitrov
@DimitarDimitrov 现在看到了,我发现区别在于他创建一个列表并将所有事件添加到其中,然后在 assert 中查询该列表。这正确吗?我应该创建一个字典,例如 PropertyName,Value,然后进行查询吗?那是一种更好的方法吗? - user9969
@user231465,根据你的测试方法名称,在这种情况下不需要那个。它有助于保持测试尽可能简单。 - istepaniuk
1个回答

5

看起来不错,但您应该将接收到的参数(或任何其他检查)存储在变量中,以保持排列/行动/断言序列。这样,您还可以断言事件实际上已经触发,而您的示例没有进行验证。

[Test]
public void Save_WhenCalled_IsSuccessfull()
{
    //Arrange
    YourArgsType actualArgs;
    var customerService= new CustomerService();  
    customerService.OnSaved+= (sender, args) =>
                                  {                                           
                                      actualArgs = args;
                                  };

    //Act
    customerService.Save(new Customer{Id=1, Name="Jo"});

    //Assert
    Assert.IsTrue(actualArgs.HasSaved);
}

编辑:添加了Alexander的建议。


哇,这正是我想要的!!为什么我没想到呢 :) - user9969
1
这里的另一个重要改进是,现在当OnSaved事件未触发时测试将失败。问题中提供的示例并没有考虑到这一点。 - Alexander Stepaniuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接