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"));
4

2 回答 2

2

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

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

于 2016-06-07T14:01:40.977 回答
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);
    }
于 2016-06-08T08:49:50.833 回答