在尝试测试某些登录/注销功能时,我想从会话中删除一些信息。我发现我根本无法访问会话。我一直得到错误:nil的未定义方法`session':NilClass。
但令我惊讶的是,我发现我可以从其他rspec页面访问会话。其他详细信息如下。我的问题是:为什么我可以从某些文件而不是其他文件访问会话?我怎样才能在下面的第二个例子中访问会话?
详细 文件:spec / controllers / tenants_controller_spec.rb
require 'spec_helper'
describe TenantsController do
specify { session[:tag].should == 'abc' }
end
文件:spec / requests / test.rb
require 'spec_helper'
describe 'Test' do
specify { session[:tag].should == 'abc' }
end
当我通过rspec运行第一个文件时,我得到:
Failure/Error: specify { session[:tag].should == 'abc' }
expected: "abc"
got: nil (using ==)
哪个好。这应该是失败的原因。
但是,当我运行第二个文件时,我得到:
Failure/Error: specify { session[:tag].should == 'abc' }
NoMethodError:
undefined method `session' for nil:NilClass
那么为什么会话是一个未定义的方法呢?
答案 0 :(得分:11)
您的第二个测试是“请求”规范,这是一个集成测试。它们旨在模拟浏览器和您获得的帮助程序,让您单击按钮并填写表单并在页面上声明文本和标签。检查会话对象是错误的抽象级别。
如果您想要验证身份验证,例如最好通过该应用程序。见,例如,在这里:Stubbing authentication in request spec
知道集成测试是“探索性”或“冒烟”测试,高级测试检查组件之间的接缝,而不是组件本身的内核。它们是编写和维护最昂贵的。使用控制器规范验证会话内容并将所有业务逻辑移动到最容易测试的模型。
答案 1 :(得分:2)
您正在测试两种不同的东西。在第一个测试中,您测试了Rails控制器,因此RSpec会为您添加session
等帮助程序。在第二个测试中,您正在进行请求测试,因此RSpec不会添加任何与控制器相关的帮助程序。
<强>更新强>
我没有测试过这个,但是看source code我认为这应该就足够了
include ::RSpec::Rails::ControllerExampleGroup
有关详细信息,请查看github上的rspec-rails
项目。
更新2
您不应在请求规范中测试Cookie,引用RSpec docs:
请求规范提供了一个围绕Rails集成测试的瘦包装器,旨在通过完整堆栈驱动行为,包括路由(由Rails提供)和没有存根(由您决定)。