首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用单元测试断言Linq集合

如何使用单元测试断言Linq集合
EN

Stack Overflow用户
提问于 2013-04-07 23:40:36
回答 1查看 3.3K关注 0票数 2

我用LinQ编写了简单的组

代码语言:javascript
运行
复制
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;                              
}

当我尝试测试它时,它说第一个索引项与我的预期不匹配。

代码语言:javascript
运行
复制
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处的元素不匹配。)

我想知道我该如何为它写一个测试。

EN

回答 1

Stack Overflow用户

发布于 2013-04-08 06:08:34

首先--,您真的不应该从方法中返回匿名类型的对象!,很难在以后的任何地方使用这种返回值。

我将创建名为分离的新结构。

代码语言:javascript
运行
复制
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;
    }
}

我已经重写了EqualsGetHashCode,以使CollectionAssert工作。

使用Devided类,您可以将方法返回类型更改为泛型IList<Devided>

代码语言:javascript
运行
复制
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;
}

和断言测试:

代码语言:javascript
运行
复制
[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

代码语言:javascript
运行
复制
var expectedNumberCollection = new List<int> { 0, 3, 4 };

Assert.IsTrue(expectedNumberCollection.SequenceEqual(remindernumber.Select(x => x.Reminder)));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15869180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档