没有路由与有效对象匹配

时间:2011-01-30 11:09:16

标签: unit-testing ruby-on-rails-3 rspec

阅读本文: "No route matches" error?

我正在试图弄清楚是否有一个宝石或方法来修补动作包来解决这个约束。

基本上,我正在编写规范(它们运行速度很快),我不明白为什么actionpack在应用于未“保存”的对象时会抛出此错误。

有两个原因:

  1. 当它真的应该抛出更有意义的东西时(例如,在构造路径之前必须保存对象,或者对象ID为nil),为什么抛出“无路由匹配”。这个例外似乎有点模糊。
  2. 如果所有我想要做的就是为该对象生成一个url,我不应该保存该对象,因为ID是使用工厂或类似的东西填充的。
  3. 这种约束使编写快速测试变得很痛苦,除非我遗漏了某些东西......

1 个答案:

答案 0 :(得分:1)

是的,错误信息有点模糊。关于第二点,您不需要保存对象来生成URL,帮助程序也可以使用文字值。

building_path(1) # GET /buildings/1 => BuildingsController#show, params={:id=>"1"}

因此在示例中,对象可以替换为任何值:

get :show, :id => "1"

例如,如果您使用rails generate scaffold Article,RSpec将构建如下规范:

  def mock_article(stubs={})
    (@mock_article ||= mock_model(Article).as_null_object).tap do |article|
      article.stub(stubs) unless stubs.empty?
    end
  end

  describe "GET show" do
    it "assigns the requested article as @article" do
      Article.stub(:find).with("37") { mock_article }
      get :show, :id => "37"
      assigns(:article).should be(mock_article)
    end
  end

没有命中数据库。