9

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

那么为什么 session 在这里是一个未定义的方法呢​​?

4

2 回答 2

12

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

如果您想取消身份验证,例如最好通过应用程序。参见,例如这里:请求规范中的存根身份验证

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

于 2012-07-05T19:08:00.673 回答
3

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

更新

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

include ::RSpec::Rails::ControllerExampleGroup

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

更新 2

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

请求规范为 Rails 的集成测试提供了一个精简的包装器,旨在通过整个堆栈来驱动行为,包括路由(由 Rails 提供)和没有存根(这取决于你)。

于 2012-07-05T11:13:36.670 回答