Joh*_*eer 4 c# unit-testing assert list
我在C#中创建了一个列表,我想做一个测试,看看Id字段的所有值是否都是唯一的.
public static List<RestaurantReview> _reviews = new List<RestaurantReview>
{
new RestaurantReview
{
Id = 1,
Name = "McDonalds",
},
new RestaurantReview
{
Id = 2,
Name = "Burger King",
},
}
Run Code Online (Sandbox Code Playgroud)
因为我做了一些调试,我发现它正在通过列表运行,但我没有得到正确的测试值.有人可以解释我在这里做错了什么吗?
[TestMethod()]
public void CheckReviewIds()
{
var FirstReview = ReviewsController._reviews.First();
bool AllUniqueIds = ReviewsController._reviews.All(s => s.Id == FirstReview.Id);
Assert.IsFalse(AllUniqueIds);
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
另一个在时间方面具有更好性能的解决方案(特别是如果您拥有的数据集很大)是使用这样的HashSet:
bool IsAllUnique<T>(IEnumerable<T> values)
{
HashSet<T> hash_set = new HashSet<T>();
return values.All(x => hash_set.Add(x));
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
bool unique = IsAllUnique(ReviewsController._reviews.Select(x => x.Id));
Run Code Online (Sandbox Code Playgroud)
此解决方案取决于HashSet.Add如果我们尝试添加的值已经存在则返回false 的事实.
此解决方案具有更好性能的一个原因是,如果检测到重复项目,则不必遍历列表中的其余项目.
您正在检查所有值是否与第一个值不相等.如果值是例如[1, 2, 3, 3,则可能是这种情况,没有一个等于第一个但是它本身,但是3 == 3.
相反,您可以GroupBy按值对它们进行分组,然后检查它们是否不同.我假设性能在这里不是一个大问题(如果列表少于100000项,我认为是这种情况):
ReviewsController._reviews.GroupBy(x => x.Id).Count() == ReviewsController._reviews.Count;
Run Code Online (Sandbox Code Playgroud)
请注意,测试组件的内部状态可能不是最佳选择,而是测试它正在公开的API.否则,您通过单元测试定义的合同受到实施细节的限制.最后一段只是关于男人的意见.
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |