断言列表

时间:2015-10-04 16:12:23

标签: c# list unit-testing assert

我在C#中创建了一个列表,我想进行一项测试,看看Id字段的所有值是否都是唯一的。

public static List<RestaurantReview> _reviews = new List<RestaurantReview>
{
    new RestaurantReview
    {
        Id = 1,
        Name = "McDonalds",
    },
    new RestaurantReview
    {
        Id = 2,
        Name = "Burger King",
    },
}

因为我做了一些调试,所以我认为它正在通过列表运行但我没有得到正确的测试值。有人可以解释我在这里做错了吗?

[TestMethod()]
public void CheckReviewIds()
{
    var FirstReview = ReviewsController._reviews.First();
    bool AllUniqueIds = ReviewsController._reviews.All(s => s.Id == FirstReview.Id);

    Assert.IsFalse(AllUniqueIds);

}

提前致谢。

3 个答案:

答案 0 :(得分:6)

另一种在时间方面具有更好性能的解决方案(特别是如果你拥有的数据集很大)是使用这样的HashSet

bool IsAllUnique<T>(IEnumerable<T> values)
{
    HashSet<T> hash_set = new HashSet<T>();

    return values.All(x => hash_set.Add(x));
}

然后你可以像这样使用它:

bool unique = IsAllUnique(ReviewsController._reviews.Select(x => x.Id));

此解决方案取决于HashSet.Add如果我们尝试添加的值已经存在则返回false的事实。

此解决方案具有更好性能的一个原因是,如果检测到重复项目,则无需检查列表中的其余项目。

答案 1 :(得分:5)

您要检查所有值是否与第一个值不相等。如果值是例如[1, 2, 3, 3],则可能是这种情况,没有一个等于第一个但是它本身,但是3 == 3

相反,您可以GroupBy按值对它们进行分组,然后检查它们是否不同。我假设表演在这里不是一个大问题(如果列表少于100000项我认为是这样的话):

 ReviewsController._reviews.GroupBy(x => x.Id).Count() == ReviewsController._reviews.Count; 

请注意,测试组件的内部状态可能不是最佳选择,而是测试它正在公开的API。否则,您通过单元测试定义的合同受到实施细节的限制。最后一段只是关于人的意见。

答案 2 :(得分:2)

我发现验证这一点的最简单方法是计算所有不同的值,并将它们与实际值的数量进行比较:

var actual = ReviewsController._reviews.Select(r => r.Id).Distinct().Count();

var expected = ReviewsController._reviews.Count();
Assert.Equal(expected, actual);