1

我正在为一个相当大的 Rails 3 应用程序编写我们的路由的 RSpec 测试套件。许多路由使用“MATCH”,但它们都不应该,特别是因为我们必须在过渡到 Rails 4 时重写它们。

我的大部分it块看起来像这样:

  it "with /comments/account/100" do
    expect(get("comments/account/100")).to    route_to("comments#list", :account_id => "100")
    expect(post("comments/account/100")).to   route_to("comments#list", :account_id => "100")
    expect(put("comments/account/100")).to    route_to("comments#list", :account_id => "100")
    expect(delete("comments/account/100")).to route_to("comments#list", :account_id => "100")
  end

不得不写无数这样的块似乎有点,非 DRY。我想要一个看起来像这样的匹配器:

expect(match_all_verbs("/comments/accounts/100")).to route_to("comments#list", :account_id => "100")

编辑:最终工作版本,感谢史蒂文:

def match_all_verbs(path, method, options = {})
  [:get, :post, :put, :delete].each do |verb|
    expect(send(verb, path)).to route_to(method, options)
  end
end

我添加了一个options哈希,这样我就可以将参数传递给路由。一切似乎都运行良好。

为了好玩,我做了一个match_no_verbs测试.to_not be_routable匹配器组合:

def match_no_verbs(path, method, options = {})
  [:get, :post, :put, :delete].each do |verb|
    expect(send(verb, path)).to_not route_to(method, options)
  end
end

非常感谢!

4

1 回答 1

1

RSpec 自定义匹配器根据文档采用单个值,因此您的形式参数values没有被定义,并且您在匹配器主体中对它的引用失败。

而不是自定义匹配器,其目的是指定相等的含义以及如何为给定类型的对象显示错误,我认为您希望使用某种帮助器来迭代动词并生成适当的expect调用。

例如,您可以使用(未​​测试):

def match_all_verbs(path, method)
  [:get, :post, :put:, :delete].each do |verb|
    expect(send(verb, path)).to route_to(method)
  end
end
于 2013-09-11T19:18:25.420 回答