如何使用Rspec链接allow_any_instance_of

时间:2015-05-17 17:38:24

标签: ruby-on-rails ruby testing rspec mocking

我在学习rspec stub如何工作方面遇到了一些麻烦。

我必须测试以下帮助方法,我希望将输出字符串测试为html:

hash_link = {"Dashboard"=>"admin_dashboard_path", "Configurações"=>""}
allow_any_instance_of(YAML).to receive(:load_file).with(["test"]).and_return(hash_link)

u = YAML
allow(u).to receive_message_chain(:load_file, :[] ,:collect)

我想测试该方法是否以正确的方式构建链接。我无法发现如何为YAML.load_file(“config / admin_links.yml”)[resource]执行存根以输出要使用的collect方法的Hash。

我已经使用

进行了测试
{{1}}

但到目前为止没有成功。我应该怎么做模拟所以“YAML.load_file(”config / admin_links.yml“)[资源]”返回“{”仪表板“=>”admin_dashboard_path“,”Configurações“=>”“”所以方法collect可以处理变量吗?

TNX,

2 个答案:

答案 0 :(得分:1)

load_fileYAML的类方法,而非实例方法,因此您可以使用allow(YAML).to receive(:load_file).and_return(hash_link)将其存根。

答案 1 :(得分:0)

Rspec通常会教你分区方法以便轻松存根。在这种情况下,提取YAML文件的读取,您可以非常简单地存储结果。

class MyClass
  def self.admin_links
    YAML.load_file("config/admin_links.yml")
  end

  def build_links(resource)
    self.class.admin_links[resource].collect do |link|
       # ...
    end
  end
end

allow(MyClass).to receive_message(:admin_links).and_return(hash_link)