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

时间:2016-06-07 10:24:21

标签: c# .net unit-testing nunit nunit-3.0

我希望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"));

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

作为另一种选择,您可以查看应该使用的框架并执行类似下面的操作

    [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);
    }