使用 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)。 阅读测试的人应该立即清楚正在测试什么场景和行为(如果startDateendDate 的值很重要,给它们提供较少的通用名称可能是有益的)。李> 最好只使用一个断言,因为这样可以在测试失败时轻松知道测试失败的位置。

【讨论】:

您可以通过将第一个查询中的select 更改为let a = 并仅使用第二个查询中的whereselect 来进行查询。 谢谢,@Rune,对循环复杂度进行了一些阅读,指导表明,您应该让方法的测试次数等于方法的循环复杂度。 (rkcole.com/articles/other/CodeMetrics-CCN.html) 另外,这可能有点多,但是单元测试本身的循环复杂度怎么可能小于 2?断言不是有条件的吗?

以上是关于使用 ForEach 进行单元测试 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥覆盖 Parallel.foreach 循环的 .NET 单元测试依赖于硬件?

如何开始用Junit进行单元测试

单元测试集成测试

使用 Oracle 进行单元测试 [关闭]

Go 单元测试从 0 到 1

Go 单元测试从 0 到 1