FluentAssertions 不应该包含失败

Posted

技术标签:

【中文标题】FluentAssertions 不应该包含失败【英文标题】:FluentAssertions Should Contain failing when it shouldn't 【发布时间】:2013-09-26 14:20:00 【问题描述】:

我在使用 FluentAssertions 编写的测试中遇到了一些奇怪的行为。我有以下课程:

public class Die

     Random rand;

     public Die()
     
       rand = new Random();
     

     public Symbol Roll()
     
       var symbols = Enum.GetValues(typeof(Symbol));
       return (Symbol)symbols.GetValue(rand.Next(symbols.Length));
     


public enum Symbol

  Success,
  Failure

我想做一些快速的理智检查,我实际上是在创建一个返回随机值的骰子,而不是总是相同的值。因此,我对 TDD 的“快速而肮脏”的做法是将其滚动 100 次,并假设它至少生成两个值一次。但是,我注意到当我将数字降低(降至 10)时,我遇到了一些我没想到的失败。把它放到 2 看起来像这样:

[TestMethod]
public void Test_Die_Roll_Returns_Multiple_Values()

  Die die = new Die();

  Enumerable.Range(1, 2)
    .Select((x) => die.Roll()).Should().Contain(Symbol.Success);

有时当我运行这个测试时,它通过了。有时,它会失败,当然当集合是 Failure,Failure 时。这是意料之中的。但是,有时它会失败并显示如下消息:

消息:ExpectedCollection Success, Failure 包含 Success。

这里到底发生了什么?我做了一些挖掘,发现很多关于包含使用引用等于而不是值等于的东西。想要继续前进,我尝试了这个:

[TestMethod]
public void Test_Die_Roll_Returns_Multiple_Values()

  Die die = new Die();

  Enumerable.Range(1, 2)
    .Select((x) => die.Roll()).Should().Contain(s => s.ToString().Equals("Success"));

只是有时会通过,有时会:

消息:集合 Success, Failure 应该有一个项目 匹配 s.ToString().Equals("Success")。

发生了什么事?

【问题讨论】:

您是否尝试在 Select() 后面附加 ToArray()?因为现在您将表达式树传递给 Should()。 不,我没有,看起来这使它按我的预期工作。我真的不明白为什么我之前所做的一切都奏效了。 【参考方案1】:

由于您的 Roll() 方法返回随机数,因此您的测试已经很脆弱。这可能只是这种随机性的结果。将表达式树传递给采用 IEnumerable 的方法是一种不好的做法,也是许多错误的根源。总是先调用 ToList() 或 ToArray() (虽然前者更快一点)。

【讨论】:

我认为随机值不是问题。将表达式树传递给 IEnumerable,这绝对看起来像是一针见血。你知道任何好的文章或阅读为什么这是不好的,在幕后发生了什么,等等,所以我可以了解更多?感谢您的帮助! 这是最常见的问题之一weblogs.asp.net/okloeten/archive/2008/05/27/6225197.aspx

以上是关于FluentAssertions 不应该包含失败的主要内容,如果未能解决你的问题,请参考以下文章

C# FluentAssertions 在断言失败后继续

FluentAssertions Should.Equal 在集合上,包含空值

[C#FluentAssertions在断言失败后继续

如果一个属性可以为空,则比较对象时 FluentAssertions 失败

FluentAssertions:如何指定该集合应包含一定数量的匹配谓词的元素?

FluentAssertions:如何指定该集合应包含一定数量的匹配谓词的元素?