C# 如何使用单元测试断言Linq集合
我已经和LinQ一起写了简单的分组C# 如何使用单元测试断言Linq集合,c#,linq,unit-testing,C#,Linq,Unit Testing,我已经和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
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;
}
public IList dividedNumbersto5(IEnumerable NumberOfCollection)
{
IList reminderNumber=NumberOfCollection.ToList().GroupBy(g=>g%5).OrderBy(g=>g.Key)
.Select(g=>new{Numbers=g,rementar=g.Key});
返回提醒号码;
}
当我尝试测试它时,它说第一个索引项与我的期望不匹配
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);
var groupingoperators=新的groupingoperators();
IEnumerable numberOfCollection=新列表{5,14,9,8};
IList提醒编号=分组运算符。dividedNumber为5(numberOfCollection);
IList expectedNumberCollection=新列表{0,3,4};
集合资产等于(预期数集合、提醒数);
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}
};
IList expectedNumberCollection=新列表{
新{Numbers=新列表{5},提醒=0},
新{编号=新列表{8},提醒=3},
新{编号=新列表{14,9},提醒=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;
}
}
和断言测试:
[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);
}
这是不可能的。您正在返回一个匿名类型列表,并将其与整数列表进行比较。当您使用
提醒时,您的意思是?@RyanGates是的,如果有帮助的话!;)
[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);
}
var expectedNumberCollection = new List<int> { 0, 3, 4 };
Assert.IsTrue(expectedNumberCollection.SequenceEqual(remindernumber.Select(x => x.Reminder)));