繁体   English   中英

如果使用Fluent断言顺序不同,如何断言两个列表是不等效的

[英]How to assert two lists are not equivalent if in different order using Fluent Assertions

使用Fluent断言,我们可以使用以下方法断言两个集合是相等的(就属性值而言):

list1.ShouldBeEquivalentTo(list2);

假设list1list2包含in any order的相同对象,则断言为true。

如果我们要声明列表的顺序正确,我们可以执行以下操作:

list1.ShouldBeEquivalentTo(list2, o => o.WithStrictOrdering());

如果列表以wrong order包含相同的对象,但是我找不到任何东西,我正在寻找断言为false的东西。

使用Fluent断言的最佳方法是什么?

PS-这是一种学术上的好奇心,在现实中甚至可能没有用:)

编辑 :现在,我了解了戴维的要求(请参阅下面的评论),我将代码更新为该解决方案。 尽管语法相似,但它不是FluentAssertion扩展,但可以通过一些操作来实现。

public static class IEnumerableAssertionExtensions
{
    public static void ShouldContainInWrongOrder<TSubject>(this IEnumerable<TSubject> source, IEnumerable<TSubject> expected)
    {
        var remaining = expected.ToList();
        var inOrder = true;
        foreach (var subject in source)
        {
            if (inOrder && !ReferenceEquals(subject, remaining[0]))
            {
                inOrder = false;
            }
            var s = subject;
            Execute.Verification.ForCondition(() => remaining.Remove(s)).FailWith("Expected item in the collection: {0}", subject.ToString());
        }

        Execute.Verification.ForCondition(() => remaining.Count == 0).FailWith(string.Format("{0} more item{1} than expected found in the list.", remaining.Count, ((remaining.Count == 1) ? string.Empty : "s")));
        Execute.Verification.ForCondition(() => !inOrder).FailWith("list items are ordered identically");
    }
}

[TestClass]
public class TestFoo
{
    class Thing
    {
        public int i;
    }

    [TestMethod]
    public void MyMethod()
    {
        var a1 = new Thing { i=0 };
        var a2 = new Thing { i=1 };
        var a3 = new Thing { i=2 };
        var a4 = new Thing { i=2 };
        var list1 = new List<Thing> { a1, a2, a3 };
        var list2 = new List<Thing> { a1, a2, a3 };
        var list3 = new List<Thing> { a3, a2, a1 };
        var list4 = new List<Thing> { a1, a2, a3, a4 };
        var list5 = new List<Thing> { a3, a2 };

        list1.ShouldContainInWrongOrder(list3); // Succeeds
        list1.ShouldContainInWrongOrder(list2); // Fails
        list1.ShouldContainInWrongOrder(list4); // Fails
        list1.ShouldContainInWrongOrder(list5); // Fails
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM