了解:[]在rpec测试中的使用

时间:2019-07-17 15:55:13

标签: ruby rspec

我决定为开放源代码项目更新一些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个参数?

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)

https://play.golang.org/p/whUMQ3pjq81

答案 1 :(得分:3)

:[]是一个哈希访问器,它接受一个参数(用于访问的哈希键)。

IMO,此测试没有意义。

您应该测试handler的返回值:如何 handler创建该值是内部实现细节。

如果您明确地需要知道它正在访问正确的option条目,则测试它是否同时访问 options[:module_name]和{{1} }。但这可以通过检查options[:runtime]的返回值和正确的测试设置来进行测试。