【发布时间】:2021-08-16 00:45:39
【问题描述】:
假设你有一些类似的课程
class Foo
...
public def methodA
x = methodB(true)
# other operations (assume x is not the return value of methodA)
end
private def methodB(arg)
if arg
return 1
else
return 0
end
end
end
当您为methodA 编写单元测试时,您想检查x 是否被分配了正确的值,这意味着您必须检查对methodB 的调用是否像您预期的那样返回1 .
您将如何在 rspec 中对其进行测试?
现在我有(在 How to test if method is called in RSpec but do not override the return value 的帮助下)
@foo = Foo.new
expect(@foo).to receive(:methodB).with(true).and_call_original
但是我不知道如何验证methodB的实际返回值。
【问题讨论】:
-
我认为您不能在给定的示例中正确测试
methodA。因为即使您测试method_b返回预期值,您仍然没有测试x是否分配了该值。而且,这些都是实现细节。如果x被重命名怎么办?如果methodB被重构怎么办?您的测试不应该关心方法或私有方法的内部结构。相反,测试整个methodA的响应或其副作用。 -
methodA没有返回任何有意义的信息。这是我想要验证的内部发生的事情。 FWIW idrc,它被“分配”给x,我只是想确保在methodA的整个过程中,当methodB不可避免地被调用时,它会返回我所期望的——还有副作用,x是本地范围的,所以我没有其他方法可以检查它,就像你可能使用类属性或其他东西一样 -
@notacorn :您所描述的情况基本上是关于
methodB为给定参数返回某个结果。无论您是从methodA内部还是从不同的地方调用methodB,都应该没有区别。因此,我将简单地编写一个单独的测试用例,仅涉及methodB。
标签: ruby unit-testing rspec rspec3