Visual Studio2008テストフレームワークで配列が等しいことを表明します


81

2つの配列が等しい(つまり、要素の数が同じで、各要素が同じである)ことを単体テストで確認する簡単な方法はありますか?

Javaでは、を使用しますがassertArrayEquals (foo, bar);、C#に相当するものはないようです。試しましたAssert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));が、関数が「a」、「b」の配列を返しても、チェックは失敗します

これは、組み込みの単体テストフレームワークを備えたVisual Studio 2008 TeamSuiteを使用しています。

回答:


147

それは、CollectionAssertCollectionAssert.AreEqualドキュメントも参照してください。


次のことに注意してください。stackoverflow.com/ questions / 5194966 /…オブジェクトは明示的に比較される可能性があり、失敗したアサーションを渡すために定義する必要がobject.EqualsあるIEqualityComparer<T>場合があります。
atconway 2013

2
これが失敗したときに、より詳細なメッセージが表示されることを望みます。「要素数の違い」と「インデックス0の要素が一致しない」は少し役に立たない。それでは彼らは何ですか?!
パニック大佐2015年

2
CollectionAssert.AreEquivalent(Visual Studio 2010から入手可能)より有益な結果が得られます。たとえば、要素の数が異なる場合、メッセージには、予想される要素の数と実際の要素の数が
示され

21

Class1.cs:


namespace ClassLibrary1
{
    public class Class1
    {
        Array arr1 = new[] { 1, 2, 3, 4, 5 };
        public Array getArray()
        {
            return arr1;
        }
    }
}

ArrayEqualTest.cs:


        [TestMethod()]
        public void getArrayTest()
        {
            Class1 target = new Class1(); 
            Array expected = new []{1,2,3,4,5}; 
            Array actual;
            actual = target.getArray();
            CollectionAssert.AreEqual(expected, actual);
            //Assert.IsTrue(expected.S actual, "is the test results");
        }

テストの成功、エラーが見つかりました:


   CollectionAssert.AreEqual failed. (Element at index 3 do not match.)

くそー私は誤ってこの回答に反対票を投じましたが、今は反対票を取り消すことができません-「この回答が編集されない限り、あなたの投票はロックされています」:(
Roman

この答えは、その前年の答えよりも良く見えません。
コンスタンチン

3

.NET 3.5では、おそらく考えてみAssert.IsTrue(foo.SequenceEqual(bar));てください。ただし、どのインデックスで異なるかはわかりません。


1

わかりました、これを行うには少し長い方法があります...

static void Main(string[] args)
{
    var arr1 = new[] { 1, 2, 3, 4, 5 };
    var arr2 = new[] { 1, 2, 4, 4, 5 };

    Console.WriteLine("Arrays are equal: {0}", equals(arr1, arr2));
}

private static bool equals(IEnumerable arr1, IEnumerable arr2)
{

    var enumerable1 = arr1.OfType<object>();
    var enumerable2 = arr2.OfType<object>();

    if (enumerable1.Count() != enumerable2.Count())
        return false;

    var iter1 = enumerable1.GetEnumerator();
    var iter2 = enumerable2.GetEnumerator();

    while (iter1.MoveNext() && iter2.MoveNext())
    {
        if (!iter1.Current.Equals(iter2.Current))
            return false;
    }

    return true;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.