[英]How to assert a Linq collection with unit test
我已經用LinQ編寫了簡單的分組
public IList dividedNumbersto5(IEnumerable<int> NumberOfCollection)
{
IList reminderNumber = NumberOfCollection.ToList().GroupBy(g => g%5).OrderBy(g=>g.Key)
.Select(g => new { Numbers = g, Remindar = g.Key}).ToList();
return reminderNumber;
}
當我嘗試測試它時,它說第一個索引項目與我的期望不匹配。
var groupingoperators = new GroupingOperators();
IEnumerable<int> numberOfCollection = new List<int>{ 5,14,9,8};
IList remindernumber = groupingoperators.dividedNumbersto5(numberOfCollection);
IList expectedNumberCollection = new List<int>{0,3,4};
CollectionAssert.AreEqual(expectedNumberCollection, remindernumber);
CollectionAssert.AreEqual失敗。 (索引為0的元素不匹配。)
我不知道該如何編寫測試。
測試失敗的原因是因為:
"Two collections are equal if they have the same elements in the same order and quantity."
基本上,您需要更好地模擬第二個收藏集。 我認為這應該工作:
IList expectedNumberCollection = new List<object>{
new {Numbers = new List<int>{5},Remindar=0},
new {Numbers = new List<int>{8},Remindar=3},
new {Numbers = new List<int>{14,9},Remindar=4}
};
首先- 您真的不應該從方法中返回匿名類型對象! 以后在任何地方都很難用這種返回值執行任何操作。
我將創建一個名為Devided的新結構:
public struct Devided
{
public int Reminder { get; set; }
public List<int> Numbers { get; set; }
public override bool Equals(object obj)
{
if(!(obj is Devided))
return false;
var d = (Devided)obj ;
if(object.ReferenceEquals(this, d))
return true;
return this.Reminder == d.Reminder && this.Numbers.SequenceEqual(d.Numbers);
}
public override int GetHashCode()
{
return Reminder;
}
}
我已經覆蓋了Equals
和GetHashCode
來使CollectionAssert
起作用。
使用Devided
類,您可以將方法返回類型更改為通用IList<Devided>
:
public static IList<Devided> dividedNumbersto5(IEnumerable<int> NumberOfCollection)
{
IList<Devided> reminderNumber = NumberOfCollection.ToList().GroupBy(g => g % 5).OrderBy(g => g.Key)
.Select(g => new Devided { Numbers = g.ToList(), Reminder = g.Key }).ToList();
return reminderNumber;
}
並斷言測試:
[TestMethod]
public void TestMethod1()
{
IEnumerable<int> numberOfCollection = new List<int> { 5, 14, 9, 8 };
IList remindernumber = dividedNumbersto5(numberOfCollection);
IList expectedNumberCollection = new List<Devided>
{
new Devided { Numbers = new List<int>() { 5 }, Reminder = 0 },
new Devided { Numbers = new List<int>() { 8 }, Reminder = 3 },
new Devided { Numbers = new List<int>() { 14, 9 }, Reminder = 4 }
};
CollectionAssert.AreEqual(expectedNumberCollection, remindernumber);
}
如果您要執行以下操作,則只能檢查Reminder
:
var expectedNumberCollection = new List<int> { 0, 3, 4 };
Assert.IsTrue(expectedNumberCollection.SequenceEqual(remindernumber.Select(x => x.Reminder)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.