如何使用 NUnit 检查列表订单(更多属性)?

How to check list orders (further properties) with NUnit?

我希望 NUnit 基于两个属性而不是一个属性测试列表顺序。

片段代码(有效):

var list = new List<Tuple<string, string>>
{
    new Tuple<string, string>("aaaa", "bbbb"),
    new Tuple<string, string>("bbbb", "aaaa"),
    new Tuple<string, string>("aaaa", "cccc"),
    new Tuple<string, string>("cccc", "bbbb")
};
var ordered = list.OrderBy(p => p.Item1).ThenBy(p => p.Item2);
Assert.That(ordered, Is.Ordered.By("Item1"));

片段代码(我想要的 - 不起作用):

var list = new List<Tuple<string, string>>
{
    new Tuple<string, string>("aaaa", "bbbb"),
    new Tuple<string, string>("bbbb", "aaaa"),
    new Tuple<string, string>("aaaa", "cccc"),
    new Tuple<string, string>("cccc", "bbbb")
};
var ordered = list.OrderBy(p => p.Item1).ThenBy(p => p.Item2);
Assert.That(ordered, Is.Ordered.By("Item1").ThenBy("Item2"));
// Below syntax works but does not return expected result
// Assert.That(ordered, Is.Ordered.By("Item1").By("Item2"));

显然,您知道 NUnit 中没有 ThenBy 语法元素,但希望 By 可以多次应用。这两个功能都不可用,并且 CollectionOrderedConstraint 仅支持单个 属性 名称。在 NUnit 中实现这两种方法都不会非常困难,因此您应该考虑提交问题以请求该功能。

目前,这是不可能的。您应该考虑以正确的顺序创建预期的元组列表并使用测试两个列表的相等性的解决方法。

作为另一种选择,您可以查看 shouldly 框架并执行如下操作

    [TestMethod]
    public void GivenAnUnorderListWhenCustomOrderExecutedThenItemsOrderbyItemOneThenByItemTwo()
    {
        var expectedOrder = new List<Tuple<string, string>>
        {
                    new Tuple<string, string>("aaaa", "bbbb"),
                    new Tuple<string, string>("aaaa", "cccc"),
                    new Tuple<string, string>("bbbb", "aaaa"),
                    new Tuple<string, string>("cccc", "bbbb")
        };

        var list = new List<Tuple<string, string>>
        {
                    new Tuple<string, string>("aaaa", "bbbb"),
                    new Tuple<string, string>("bbbb", "aaaa"),
                    new Tuple<string, string>("aaaa", "cccc"),
                    new Tuple<string, string>("cccc", "bbbb")
        };

        var orderedList = list.OrderBy(p => p.Item1).ThenBy(p => p.Item2);
        orderedList.ShouldBe(expectedOrder);
    }