我决定为开放源代码项目更新一些ruby代码。因为我对Ruby的经验是零,但我却能做到这一点,所以这很麻烦。我遇到的问题是了解rspec测试中的一行。
被测部分在下面。根据我的理解,选项是类中的变量,还是默认情况下传递给ruby方法的变量。
def handler
module_name = options[:module_name] || default_module_name
handler_name = option(:handler_name)
"#{module_name}.#{handler_name}"
end
测试为
expect(provider.options).to receive(:[]).with(:module_name).and_return(nil)
我试图访问哈希上的:runtime
键,所以我这样更新:
def handler
module_name = options[:module_name] || default_module_name
runtime = options[:runtime] || default_runtime
handler_name = option(:handler_name)
"#{module_name}.#{handler_name}"
end
更新的测试
expect(provider.options).to receive(:[]).with(:module_name, :runtime).and_return(nil)
我对to receive(:[]).with(:module_name, :runtime)
的解释是采用数组对象/方法(?),并将值:module_name, :runtime
放入其中。
但是,这显然是不正确的,因为测试失败并显示:
received :[] with unexpected arguments expected: (:module_name, :runtime) got: (:module_name)
那么:[]
是什么?如何更新它以接受2个参数?
答案 0 :(得分:3)
:[]
是一种在您的情况下例如e.gg options[:module_name]
中实现索引运算符的方法。
https://makandracards.com/makandra/51337-rspec-expecting-multiple-calls-of-the-same-method
[1] pry(main)> h = {a: 1, b: 2}
=> {:a=>1, :b=>2}
[2] pry(main)> h[:a]
=> 1
[3] pry(main)> h.send(:[], :a)
=> 1
[4] pry(main)>
如果您想将其存入多个呼叫中,请使用多个期望值:
expect(provider.options).to receive(:[]).with(:module_name).and_return(nil)
expect(provider.options).to receive(:[]).with(:runtime).and_return(nil)
答案 1 :(得分:3)
:[]
是一个哈希访问器,它应接受一个参数(用于访问的哈希键)。
IMO,此测试没有意义。
您应该测试handler
的返回值:如何 handler
创建该值是内部实现细节。
如果您明确地需要知道它正在访问正确的option
条目,则测试它是否同时访问 options[:module_name]
和{{1} }。但这可以通过检查options[:runtime]
的返回值和正确的测试设置来进行测试。