如何验证已对集合应用了多种排序?

时间:2018-07-02 16:24:48

标签: c# unit-testing sorting tdd fluent-assertions

我正在Kendo网格上实现可排序的列,用户期望的行为是允许同时对多个列进行排序。

很自然地,我首先编写一个单元测试,以能够首先通过Ref升序,然后Name升序来验证排序(默认情况下)。

有问题的测试供应商在这里:

_context.Suppliers.Add(new Supplier { Ref = "abc", Name = "steve"});
_context.Suppliers.Add(new Supplier { Ref = "abc", Name = "bob"});    
_context.Suppliers.Add(new Supplier { Ref = "cde", Name = "ian"});    
_context.Suppliers.Add(new Supplier { Ref = "fgh", Name = "dan"}); 

然后我去要求我的分类供应商进行测试。

我知道流畅的断言有BeInAscendingOrderBeInDescendingOrder方法,但是即使在阅读了文档和following possibly related questions之后,我也看不到链接排序方法的示例。

我当前的测试验证是这样的:

results.Should().HaveCount(4).And.BeInAscendingOrder(x => x.Ref)
           .And.BeInAscendingOrder(x => x.Name);

我希望验证的工作方式类似于LINQ,其中包含OrderBy(x => x.Ref).ThenBy(x => x.Name)

但是,在运行测试时,它失败了,因为它期望该集合按Name(最终的排序断言)升序排列。

是否有一种方法可以告诉Fluent断言,排序应该相互结合而不是按顺序应用?

2 个答案:

答案 0 :(得分:0)

一种方法是使用BeInAscendingOrder的重载:

BeInAscendingOrder(IComparer<T> comparer, string because = "", params object[] args)

,然后创建一个继承自SupplierComparer的{​​{1}}。

这是一个完整的例子

Comparer<Supplier>

答案 1 :(得分:0)

因此,我尝试了Fabio / Stuart使用WithStrictOrdering的评论,并且该评论工作了一段时间。

但是,当我要更改排序顺序时,我的测试会不断通过而不是失败(因为我更改了测试的排序,但没有更改方法)。

以下功能非常出色:

var resultsList = results.ToList();
var expectedResults = resultsList.OrderByDescending(x => x.IsSupplierInvalid)
                                        .ThenBy(x => x.Ref).ToList();
resultsList.Should().HaveCount(4).And.ContainInOrder(expectedResults);