如何验证多个排序已应用于集合?
How to verify that multiple sorts have been applied to a collection?
我正在我的 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"});
那我去问我分拣好的供应商测试
我知道的 Fluent assertions 有 BeInAscendingOrder
和 BeInDescendingOrder
方法,但是即使在查看文档和 之后,我也看不到链接排序方法的示例。
我目前的测试验证是这样的:
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 Assertions 应该结合应用排序而不是按顺序应用排序?
一种方法是使用 BeInAscendingOrder
:
的重载
BeInAscendingOrder(IComparer<T> comparer, string because = "", params object[] args)
然后创建一个继承自 Comparer<Supplier>
的 SupplierComparer
。
这是一个完整的例子
class Supplier
{
public string Ref { get; set; }
public string Name { get; set; }
}
class SupplierComparer : Comparer<Supplier>
{
public override int Compare(Supplier x, Supplier y)
{
var compareRef = x.Ref.CompareTo(y.Ref);
if (compareRef != 0)
{
return compareRef;
}
var compareName = x.Name.CompareTo(y.Name);
if (compareName != 0)
{
return compareName;
}
return 0;
}
}
public void MyTestMethod()
{
var suppliers = new[]
{
new Supplier { Ref = "abc", Name = "steve" },
new Supplier { Ref = "abc", Name = "bob" },
new Supplier { Ref = "cde", Name = "ian" },
new Supplier { Ref = "fgh", Name = "dan" }
};
var comparer = new SupplierComparer();
suppliers.Should().BeInAscendingOrder(comparer);
}
所以我尝试了 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);
我正在我的 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"});
那我去问我分拣好的供应商测试
我知道的 Fluent assertions 有 BeInAscendingOrder
和 BeInDescendingOrder
方法,但是即使在查看文档和
我目前的测试验证是这样的:
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 Assertions 应该结合应用排序而不是按顺序应用排序?
一种方法是使用 BeInAscendingOrder
:
BeInAscendingOrder(IComparer<T> comparer, string because = "", params object[] args)
然后创建一个继承自 Comparer<Supplier>
的 SupplierComparer
。
这是一个完整的例子
class Supplier
{
public string Ref { get; set; }
public string Name { get; set; }
}
class SupplierComparer : Comparer<Supplier>
{
public override int Compare(Supplier x, Supplier y)
{
var compareRef = x.Ref.CompareTo(y.Ref);
if (compareRef != 0)
{
return compareRef;
}
var compareName = x.Name.CompareTo(y.Name);
if (compareName != 0)
{
return compareName;
}
return 0;
}
}
public void MyTestMethod()
{
var suppliers = new[]
{
new Supplier { Ref = "abc", Name = "steve" },
new Supplier { Ref = "abc", Name = "bob" },
new Supplier { Ref = "cde", Name = "ian" },
new Supplier { Ref = "fgh", Name = "dan" }
};
var comparer = new SupplierComparer();
suppliers.Should().BeInAscendingOrder(comparer);
}
所以我尝试了 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);