如何在 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 名称,以及您传递给 post
或 get
调用告诉 rspec-rails 方法名称。它只是实例化控制器class并直接调用方法。
但是,当调用 action 方法时,Rails 会查找到该控制器和 action 的路由,并出于一些偶然的原因使用它,例如在 request.env['PATH_INFO']
中构建 URI .当然,使用的路由取决于路由文件中的内容。
因此,要在控制器规范中执行给定路由,请调用路由路由到的控制器和操作。
注意rspec-rails也有routing specs,用来直接测试路由的目的。
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 名称,以及您传递给 post
或 get
调用告诉 rspec-rails 方法名称。它只是实例化控制器class并直接调用方法。
但是,当调用 action 方法时,Rails 会查找到该控制器和 action 的路由,并出于一些偶然的原因使用它,例如在 request.env['PATH_INFO']
中构建 URI .当然,使用的路由取决于路由文件中的内容。
因此,要在控制器规范中执行给定路由,请调用路由路由到的控制器和操作。
注意rspec-rails也有routing specs,用来直接测试路由的目的。