gpt4 book ai didi

c# - 多个期望/断言来验证测试结果

转载 作者:行者123 更新时间:2023-11-30 17:16:41 25 4
gpt4 key购买 nike

我在几本关于 TDD 和 BDD 的书籍和文章中读到,应该避免在单个单元测试或规范中使用多个断言或期望。我能理解这样做的原因。我仍然不确定验证复杂结果的好方法是什么。

假设被测方法返回一个复杂对象作为结果(例如反序列化或数据库读取),我该如何正确验证结果?

1.断言每个属性:

  Assert.AreEqual(result.Property1, 1);
Assert.AreEqual(result.Property2, "2");
Assert.AreEqual(result.Property3, null);
Assert.AreEqual(result.Property4, 4.0);

2.依赖正确实现的.Equals():

Assert.AreEqual(result, expectedResult);

1. 的缺点是,如果第一个断言失败,则所有后续断言都不会运行,这可能包含查找问题的有值(value)信息。可维护性也可能是一个问题,因为属性来来去去。

2.的缺点是,我似乎用这个测试测试了不止一个东西。如果 .Equals() 没有正确实现,我可能会得到误报或误报。还有 2。我看不出,如果测试失败,哪些属性实际上不同,但我认为通常可以通过适当的 .ToString() 覆盖来解决。无论如何,我认为我应该避免被迫在失败的测试中抛出调试器以查看差异。我应该马上看到它。

2 的下一个问题是它比较整个 对象,即使对于某些测试只有一些 属性可能很重要。

在 TDD 和 BDD 中,什么是合适的方法或最佳实践。

最佳答案

不要从字面上理解 TDD 建议。 “好人”的意思是每次测试都应该测试一件事(以避免测试因多种原因而失败,随后不得不调试测试以找到原因)。现在测试“一件事”意味着“一种行为”;恕我直言,每个测试都不是一个断言。

这是准则,不是规则。

所以选项:用于比较整个数据值对象

  • 如果该对象已经公开了一个可用的产生式 Equals,请使用它。
  • 否则不要添加仅用于测试的 Equals (See also Equality Pollution)。使用辅助/扩展方法(或者您可以在断言库中找到一个)obj1.HasSamePropertiesAs(obj2)

用于比较对象的非结构化部分(任意属性集 - 这应该很少见),

  • 创建一个命名良好的私有(private)方法 AssertCustomerDetailsInOrderEquals(params) 以便在您实际测试的部分中明确测试。将断言集移到私有(private)方法中。

关于c# - 多个期望/断言来验证测试结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7078434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com