会话在一些rspec文件中可用而不在其他文件中.怎么会?

sno*_*guy 7 session rspec ruby-on-rails

在尝试测试某些登录/注销功能时,我想从会话中删除一些信息.我发现我根本无法访问会话.我一直得到错误:nil的未定义方法`session':NilClass.

但令我惊讶的是,我发现我可以从其他rspec页面访问会话.其他详细信息如下.我的问题是:为什么我可以从某些文件而不是其他文件访问会话?我怎样才能在下面的第二个例子中访问会话?

详细信息文件:spec/controllers/tenants_controller_spec.rb

require 'spec_helper'

describe TenantsController do
  specify { session[:tag].should == 'abc' }
end
Run Code Online (Sandbox Code Playgroud)

文件:spec/requests/test.rb

require 'spec_helper'

describe 'Test' do
  specify { session[:tag].should == 'abc' }
end
Run Code Online (Sandbox Code Playgroud)

当我通过rspec运行第一个文件时,我得到:

Failure/Error: specify { session[:tag].should == 'abc' }
  expected: "abc"
    got: nil (using ==)
Run Code Online (Sandbox Code Playgroud)

这很好.这应该是失败的原因.

但是,当我运行第二个文件时,我得到:

 Failure/Error: specify { session[:tag].should == 'abc' }
 NoMethodError:
   undefined method `session' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

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

Wol*_*old 11

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

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

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