理解:[]在rpec测试中使用
Understand :[] use in rpec test
我决定尝试为一个开源项目更新一些 ruby 代码。这有点困难,因为我的 Ruby 经验是零,但我已经到了。我 运行 遇到的问题是理解 rspec 测试中的一行。
正在测试的部分如下。根据我的理解,选项是 class 上的一个变量,或者默认情况下传递给 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 个参数?
:[]
是一种在您的案例中实现索引运算符的方法 e.gg options[:module_name]
。
[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)
https://makandracards.com/makandra/51337-rspec-expecting-multiple-calls-of-the-same-method
:[]
这里是一个散列访问器,它应该 接受一个参数(要访问的散列键)。
IMO 这个测试毫无意义。
您应该测试 handler
的 return 值:如何 handler
创建该值是一个内部实现细节。
如果你明确地需要知道它正在访问正确的option
条目然后测试它访问bothoptions[:module_name]
和 options[:runtime]
。但这将通过检查 handler
的 return 值和正确的测试设置来测试。
我决定尝试为一个开源项目更新一些 ruby 代码。这有点困难,因为我的 Ruby 经验是零,但我已经到了。我 运行 遇到的问题是理解 rspec 测试中的一行。
正在测试的部分如下。根据我的理解,选项是 class 上的一个变量,或者默认情况下传递给 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 个参数?
:[]
是一种在您的案例中实现索引运算符的方法 e.gg options[:module_name]
。
[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)
https://makandracards.com/makandra/51337-rspec-expecting-multiple-calls-of-the-same-method
:[]
这里是一个散列访问器,它应该 接受一个参数(要访问的散列键)。
IMO 这个测试毫无意义。
您应该测试 handler
的 return 值:如何 handler
创建该值是一个内部实现细节。
如果你明确地需要知道它正在访问正确的option
条目然后测试它访问bothoptions[:module_name]
和 options[:runtime]
。但这将通过检查 handler
的 return 值和正确的测试设置来测试。