最简洁的答案是不”。更有趣的部分是为什么/如何可能出现这种情况。
我认为之所以会引起困惑,是因为您试图遵守严格的测试实践(单元测试与集成测试,模拟等),而这些代码似乎并不遵循严格的实践。
这并不是说代码是“错误的”,或者说特定的实践比其他的更好。简单地说,测试实践所做出的某些假设可能不适用于这种情况,并且可能有助于在编码实践和测试实践中使用类似级别的“严格性”;或至少承认它们可能是不平衡的,这将导致某些方面不适用或多余。
最明显的原因是您的函数正在执行两个不同的任务:
Person
根据他们的名字查找一个。这需要进行集成测试,以确保可以找到Person
可能在其他地方创建/存储的对象。
Person
根据性别来计算a 是否足够大。这需要进行单元测试,以确保计算能够按预期进行。
通过将这些任务组合到一个代码块中,您将无法运行另一个任务。当您想对测试进行单元测试时,您不得不Person
(从真实的数据库或存根/模拟中)查找一个。当您想测试查找是否与系统的其余部分集成时,您还必须对年龄进行计算。我们该怎么做呢?我们应该忽略它还是检查它?这似乎是您在问题中描述的确切困境。
如果我们设想一种替代方案,则我们可以自己进行计算:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
由于这是一个纯计算,因此我们不需要对其进行集成测试。
我们可能也很想单独编写查找任务:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
但是,在这种情况下,功能是如此接近Person::API.new
,我想您应该使用它(如果需要默认名称,是否可以将其更好地存储在其他地方,例如class属性?)。
为Person::API.new
(或person_from_name
)编写集成测试时,您需要关注的是是否能够获得预期的结果Person
; 所有基于年龄的计算都在其他地方处理,因此您的集成测试可以忽略它们。