能否为含回调方法的Rails方法编写测试?如何用Minitest存根回调?
在Minitest中存根回调方法的正确方式
当然可以用Minitest对这个回调进行存根!不过你之前的写法有个关键问题——你试图在SomeObject的实例上存根:callback_method,但实际上这个方法是OtherObject的类方法,所以得调整存根的目标对象才行。
问题分析
你的SomeObject#test_method里调用的是OtherObject.callback_method,这是一个类方法,所以存根的对象应该是OtherObject这个类,而不是SomeObject的实例。
正确的存根实现
下面是两种常见的存根场景:
1. 完全替换callback_method的返回值
如果你想直接跳过callback_method的所有逻辑,返回一个固定值,可以这么写:
class SomeObjectTest < Minitest::Test def test_test_method some_object = SomeObject.new # 针对OtherObject类存根它的callback_method类方法 OtherObject.stub(:callback_method, "预期的存根结果") do # 执行被测方法并断言结果 result = some_object.test_method assert_equal "预期的存根结果", result end end end
2. 保留block执行逻辑,跳过原方法的全局检查
如果你想让callback_method仍然执行传入的block,但跳过它原本的“global checks”,可以给存根传一个自定义的lambda:
class SomeObjectTest < Minitest::Test def test_test_method_with_block_execution some_object = SomeObject.new # 存根时保留yield逻辑,跳过原方法的检查 OtherObject.stub(:callback_method, ->(true_or_false) { yield }) do result = some_object.test_method # 这里断言block执行后的结果 assert_equal "test method logic的返回值", result end end end
为什么原来的写法不生效?
你之前的代码some_object.stub(:callback_method, true)是在SomeObject的实例上存根一个名为callback_method的实例方法,但你的SomeObject根本没有定义这个实例方法——test_method里调用的是另一个类的方法,所以这个存根完全没作用到目标方法上。
内容的提问来源于stack exchange,提问作者Mark Kadlec
相关产品推荐
相关产品推荐

