理解:[]在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]

See docs

[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 值和正确的测试设置来测试。