在尝试测试某些登录/注销功能时,我想从会话中删除一些信息.我发现我根本无法访问会话.我一直得到错误: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
那么为什么会话是一个未定义的方法呢?
解决方法
您的第二个测试是“请求”规范,这是一个集成测试.它们旨在模拟浏览器和您获得的帮助程序,让您单击按钮并填写表单并在页面上声明文本和标签.检查会话对象是错误的抽象级别.
如果您想要验证身份验证,例如最好通过该应用程序.参见,例如这里:Stubbing authentication in request spec
知道集成测试是“探索性”或“冒烟”测试,高级测试检查组件之间的接缝,而不是组件本身的内核.它们是编写和维护最昂贵的.使用控制器规范验证会话内容并将所有业务逻辑移动到最容易测试的模型.