如何在 RSpec 控制器规范中调用两条相似路由中的另一条?

How to call the other of two similar routes in an RSpec controller spec?

Rails 4.1.8
Rspec 3.4.4

给定 2 条路线,我无法理解如何调用它们。

路线 a) /data_services/add_comment/:id
路线 b) /data_services/:id/add_comment

在services_controller_spec.rb

describe 'create comment' do
  let!(:service) { FactoryGirl.create(:service) }

  describe 'with valid comment' do
    it 'creates a new comment' do
      expect {
        post :add_comment, id: service.id
      }.to change(service.service_comments, :count).by(1)

      expect(response).to redirect_to(service_path(service))
    end
  end
end

我相信使用此代码,我的测试将引用路线 a)。我将如何参考路线 b)?

当您在 rspec-rails 控制器规范中调用动作时,您不是在调用路由,而是在直接调用控制器和动作。您将控制器名称传递给的 describe 块告诉 rspec-rails class 名称,以及您传递给 postget 调用告诉 rspec-rails 方法名称。它只是实例化控制器class并直接调用方法。

但是,当调用 action 方法时,Rails 会查找到该控制器和 action 的路由,并出于一些偶然的原因使用它,例如在 request.env['PATH_INFO'] 中构建 URI .当然,使用的路由取决于路由文件中的内容。

因此,要在控制器规范中执行给定路由,请调用路由路由到的控制器和操作。

注意rspec-rails也有routing specs,用来直接测试路由的目的。