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 不应该包含失败的主要内容,如果未能解决你的问题,请参考以下文章
FluentAssertions Should.Equal 在集合上,包含空值
如果一个属性可以为空,则比较对象时 FluentAssertions 失败