2013-11-01 137 views
4

我需要比較列表就像在我的單元測試下面的對比列表:不能在單元測試

var x = new List<object>() { new List<int>() }; 
var y = new List<object>() { new List<int>() }; 
CollectionAssert.AreEqual(x, y, "Expected response not the same as actual response."); 

但我總是得到下面的異常,我該如何去克服呢?

[Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException] = { 「CollectionAssert.AreEqual失敗。預期響應不一樣 實際響應。(元素索引0處不匹配。)」}

+0

Similair的問題在這裏:http://stackoverflow.com/questions/5194966/mstest-collectionassert-areequivalent-failed-the-expected-collection-containing –

回答

1

作爲替代方案,您可以考慮使用FluentAssertions單元測試框架,該框架與Microsoft單元測試兼容。

那麼你的代碼將變成:

var x = new List<object>() { new List<int>() }; 
var y = new List<object>() { new List<int>() }; 

x.ShouldBeEquivalentTo(y, "Expected response not the same as actual response."); 

這也符合這樣的事情工作:

var ints1 = new List<int>(); 
var ints2 = new List<int>(); 

ints1.Add(1); 
ints2.Add(1); 

var x = new List<object>() { ints1 }; 
var y = new List<object>() { ints2 }; 

x.ShouldBeEquivalentTo(y, "Expected response not the same as actual response."); 

如果你改變ints2.Add(1);ints2.Add(2);,單元測試,然後將正確失敗。

注意ShouldBeEquivalentTo()遞歸下降被比較的對象,並處理集合,因此名單中甚至列出將與它的工作 - 例如:

var ints1 = new List<int>(); 
var ints2 = new List<int>(); 

ints1.Add(1); 
ints2.Add(1); // Change this to .Add(2) and the unit test fails. 

var objList1 = new List<object> { ints1 }; 
var objList2 = new List<object> { ints2 }; 

var x = new List<object> { objList1 }; 
var y = new List<object> { objList2 }; 

x.ShouldBeEquivalentTo(y, "Expected response not the same as actual response."); 
0

比較兩個空列表的引用,如果需要比較內部值類型,則必須手動比較它(例如,寫入列表<>擴展名)。

擴展示例。

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     var x = new List<object>() { new List<int>(){1} }; 
     var y = new List<object>() { new List<int>(){1} }; 
     x.SequenceRecursiveEqual(y); 

    } 
} 

public static class ExtenderListAssert 
{ 
    public static void SequenceRecursiveEqual(this IList sourse, IList expected) 
    { 
     if (sourse.Count != expected.Count) 
      Assert.Fail(); 
     else 
     { 
      for (var i = 0; i < sourse.Count; i++) 
      { 
       var left = sourse[i]; 
       var right = expected[i]; 
       if(left is IList && right is IList) 
       { 
        (left as IList).SequenceRecursiveEqual(right as IList); 
       } 
       else 
       { 
        Assert.AreEqual(left, right); 
       } 
      } 
     } 
    } 
} 
+0

請給我一個代碼示例 – user2890243

+0

檢查我的重播 – sh1ng

-1

您可以使用SequenceEqual和檢查返回布爾的說法

+0

相信這是特定於NUnit的。 OP似乎正在使用Visual Studio測試工具。 –

+0

這些集合中的整數列表不相同,因此SequenceEqual將返回false –

+0

這是linq。 http://msdn.microsoft.com/en-us/library/bb348567.aspx – Epsilon

2

這是因爲

new List<int>().Equals(new List<int>()) 

回報False。外部列表不相等,因爲內部列表不相等。

您可以嘗試使用接受ICompareroverload,它會將您的兩個空列表視爲相等。

-1

使用此類型:

[TestMethod] 
public void AreEqualTest1() 
{ 
    List<string> countries1 = new List<string> { "Israel", "USA", "Germany" }; 
    List<string> countries2 = new List<string> { "Israel", "USA", "Germany" }; 
    // First compare count of both collections:countries1 && countries2 => 
    // if not the same count => test failed. 
    // Otherwise copmare the equality items of both collections in order, 
    // if one of the comparison failed => test failed 
    // otherwise =>=> test passed. 
    CollectionAssert.AreEqual(countries1, countries2, "Not equal, hence failed"); 
} 
+2

此答案與問題相關? –

3

按照msdn的文檔。 http://msdn.microsoft.com/en-us/library/ms243736.aspx

兩個集合在相同的 訂單和數量中具有相同的元素時是相等的。如果它們的值相等,則元素相等,如果它們引用相同的對象,則元素不等於 。元素的值在默認情況下使用Equals進行比較 。

現在看來,收集是平等的。直到你深入瞭解。按照文檔

在同一順序的相同元素和數量

從你的例子他們沒有相同的元素。它們具有相同類型的元素,並且這些元素具有相似的簽名,但是這兩個元素並不相同。他們是完全不同的對象。

使用「相同順序的相同元素」運行您的測試並查看結果是什麼。如。

List<int> list = new List<int>(); 
var x = new List<object>() { list }; 
var y = new List<object>() { list }; 
CollectionAssert.AreEqual(x, y, "Expected response not the same as actual response."); 

你會發現這個通過列表的參數參數爲CollectionAssert.AreEqual滿足。

希望這會清除它。

0

您應該使用的SelectMany提取外部列表的內容,然後檢查是否相等,如:

var x = new List<object>() { new List<int>() }; 
var y = new List<object>() { new List<int>() }; 

var xItems=x.SelectMany(item=>item); 
var yItems=y.SelectMany(item=>item); 
CollectionAssert.AreEqual(xItems, yItems, "Expected response not the same as actual response."); 

正如其他人指出,AreEqual在每個項目上使用Equals檢查平等和明顯的兩個不同列表實例永遠不會相等。