ruby-on-rails - 使用 rspec 测试通用 Controller 操作

标签 ruby-on-rails rspec

这是我的路线的样子:

 /article/:id/:action     {:root=>"article", :controller=>"article/article", :title=>"Article"}

这是我的 Controller 的样子:
# app/controllers/article/article_controller.rb
class ArticleController < ApplicationController
  def save_tags
    # code here
  end
end

我想测试 save_tags 操作,所以我这样写我的规范:
describe ArticleController do       
   context 'saving tags' do
     post :save_tags, tag_id => 123, article_id => 1234
     # tests here
   end
end

但是当我运行这个规范时,我得到了错误
ActionController::RoutingError ...
No route matches {:controller=>"article/article", :action=>"save_tags"}

我认为问题是 save_tags Action 是一个通用的 Controller Action ,即。路由中没有/article/:id/save_tags 。测试此 Controller 操作的最佳方法是什么?

最佳答案

你很准。问题是您正在寻找一条没有 :id 的路线。在里面,但你没有。您需要将参数传递给 post :save_tags:id ,鉴于上述问题,我相信这就是您所说的article_id .

因此,尝试将您的测试更改为:

describe ArticleController do       
   context 'saving tags' do
     post :save_tags, tag_id => 123, id => 1234
     # tests here
   end
end

更新

Rails 可能会因为您使用 :action 而感到困惑在你的路线上,我相信 action要么是保留字,要么是 Rails 认为特殊的字。也许尝试将您的路线更改为:
/article/:id/:method_name {:root=>"article", :controller=>"article/article", :title=>"Article"}
你的测试:
describe ArticleController do       
  context 'saving tags' do
    post :save_tags, { :tag_id => 123, :article_id => 1234, :method_name => "save_tags" }
    # tests here
  end
end

关于ruby-on-rails - 使用 rspec 测试通用 Controller 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20129270/

相关文章:

ruby-on-rails - rails 3.2.0 仅当它是 json 格式时才在过滤器之前跳过

ruby-on-rails - 启动 Rails 时定义 "current time"?

ruby-on-rails - 多个复选框,转换为字符串,单个 DB 列 Rails

ruby-on-rails - 通过终端测试 Rails 嵌套表单 POST

ruby-on-rails - Class.new 在这个 Rspec 中有什么好处

ruby-on-rails - 测试 twilio API

ruby-on-rails - Ruby on Rails 究竟是什么?

ruby - 在这种情况下我将如何使用 VCR(使用 WebMock)?

ruby - 访问 "it" block 外的 ExampleGroup 范围

ruby-on-rails - 如何使用 Capybara 和 Poltergeist 测试 rails 4 确认对话框?