某些rspec文件中提供的会话,而不是其他文件。 怎么会?

在尝试测试某些登录/注销function时,我想从会话中删除一些信息。 我发现我根本无法访问会话。 我一直得到错误: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 

那么为什么会话是一个未定义的方法呢​​?

您的第二个测试是“请求”规范,这是一个集成测试。 它们旨在模拟浏览器和您获得的帮助程序,让您单击按钮并填写表单并在页面上声明文本和标签。 检查会话对象是错误的抽象级别。

如果你想要validation身份,例如最好通过应用程序。 请参阅,例如: 在请求规范中对存根进行身份validation

知道集成测试是“探索性”或“冒烟”测试,高级测试检查组件之间的接缝,而不是组件本身的内核。 它们是编写和维护最昂贵的。 使用控制器规范validation会话内容并将所有业务逻辑移动到最容易测试的模型。

你正在测试两种不同的东西。 在第一个测试中,您测试了一个Rails控制器,因此RSpec session为您添加session帮助程序。 在第二个测试中,您正在进行请求测试,因此RSpec不会添加任何与控制器相关的帮助程序。

UPDATE

我没有对此进行测试,但查看源代码我认为这应该足够了

 include ::RSpec::Rails::ControllerExampleGroup 

有关更多信息,请查看github上的rspec-rails项目。

更新2

您不应该在请求规范中测试cookie,引用RSpec文档 :

请求规范提供了一个围绕Rails集成测试的瘦包装器,旨在通过完整堆栈驱动行为,包括路由(由Rails提供)和没有存根(由您决定)。