使用 ForEach 进行单元测试 [关闭]
Posted
技术标签:
【中文标题】使用 ForEach 进行单元测试 [关闭]【英文标题】:Unit Testing with ForEach [closed] 【发布时间】:2016-04-23 18:54:13 【问题描述】:假设: "personList" 是 Person 对象的列表
“agent”是一个可以提供关于 Shop 对象的活动的对象(Person 的一个属性)
“GetShopActivity”返回一个 Person 的购物活动对象列表
我在一个测试项目中有这一行:
personList.ForEach(p => new List<Person>(p.Shops)
.ForEach(t=> Assert.IsNotNull(agent.GetShopActivity(t, startDate, endDate))));
我怎样才能让它变得更好?
【问题讨论】:
使其更具可读性。 定义更好的含义。目前有什么问题?虽然我回显@stuartd,但它很容易变得更具可读性。 将每个嵌套/后续方法调用放在一个新行上。 为什么要使用ForEach
,恕我直言foreach
会更具可读性。您也可以避免创建该中间列表。
使用真实的foreach
。不要滥用列表,您可以将所有这些内容放在一行中。
【参考方案1】:
您可能可以做很多事情,但首先要做的是使其更具可读性。也许是这样的:
var nullActivities =
from p in partnerList
from t in p.Tenants
let activity = agent.GetShopActivity(t, startDate, endDate)
where activity == null
select activity;
Assert.Empty(nullActivities);
此外:
你可以考虑
a test should be simple(即它的 Cyclomatic Complexity 应该是 1)。 阅读测试的人应该立即清楚正在测试什么场景和行为(如果startDate
和endDate
的值很重要,给它们提供较少的通用名称可能是有益的)。李>
最好只使用一个断言,因为这样可以在测试失败时轻松知道测试失败的位置。
【讨论】:
您可以通过将第一个查询中的select
更改为let a =
并仅使用第二个查询中的where
和select
来进行查询。
谢谢,@Rune,对循环复杂度进行了一些阅读,指导表明,您应该让方法的测试次数等于方法的循环复杂度。 (rkcole.com/articles/other/CodeMetrics-CCN.html)
另外,这可能有点多,但是单元测试本身的循环复杂度怎么可能小于 2?断言不是有条件的吗?以上是关于使用 ForEach 进行单元测试 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章