Dan*_*nor 2 testing rspec ruby-on-rails controllers
我试图孤立地测试我的控制器的动作链.具体来说,我想确保我所需的行为适用于我所有控制器的操作.例如,测试我的所有操作都需要身份验证:
context "when not authenticated" do
# single case
describe "GET index" do
it "responds with 401" do
get :index
response.code.should be(401)
end
end
# all of them...
described_class.action_methods.each do |action|
['get', 'put', 'post', 'delete', 'patch'].each do |verb|
describe "#{verb.upcase} #{action}" do
it "responds with 401" do
send verb, action
response.code.should == "401"
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
我希望这可行,但事实并非如此.我得到一些ActionController::RoutingErrors.这是因为我的一些路线需要参数,在某些情况下我不提供它们(就像我打电话时post :create).我明白了.但我不明白的是:为什么要重要!?
对于这些测试,路由是一个单独的问题.我关心我的行动链,而不是我的要求(这就是我拥有的routing specs和我request specs的).我不应该关心自己在这个级别的路线限制.
所以我的问题是:有没有办法在不模拟请求的情况下测试动作链?
编辑:一些研究
看起来在TestCase#进程中正在运行路由.这有必要吗?
一个解决方法是放松路由引擎的约束.这不会绕过路由,但它确实使测试更容易.
在您的规范中添加以下内容:
before(:all) do
Rails.application.routes.draw { match ':controller(/:action)' }
end
after(:all) do
Rails.application.reload_routes!
end
Run Code Online (Sandbox Code Playgroud)
虽然不是严格意义上的答案,但它可能是一个很好的解决方案.
| 归档时间: |
|
| 查看次数: |
1680 次 |
| 最近记录: |