1

Fluent Assertionsを使用すると、次のようなものを使用して、2 つのコレクションが (プロパティ値に関して) 等しいことをアサートできます。

list1.ShouldBeEquivalentTo(list2);

とが同じオブジェクトを含むと仮定するlist1と、アサーションは true になります。list2in any order

リストが正確な順序であると主張したい場合は、次のようにすることができます。

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

リストに同じオブジェクトが含まれている場合に false をアサートするものを探していwrong orderますが、何も見つかりません。

Fluent Assertions を使用する最良の方法は何ですか?

PS - それは一種の学術的好奇心であり、実際にはそれほど役に立たないかもしれません:)

4

1 に答える 1

1

編集:デイビーが求めていることを理解したので(以下のコメントを参照)、コードをこのソリューションに更新しました。構文は似ていますが、これは 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
    }
}
于 2015-03-26T14:48:01.577 に答える