【问题标题】:Set a session var in Rspec Request spec在 Rspec 请求规范中设置会话变量
【发布时间】:2019-04-26 03:12:57
【问题描述】:

我正在尝试在请求规范中设置会话变量。

我已经尝试了以下方法来做到这一点:

RSpec.describe 'Application Controller' do
  context 'updating an application' do
    before :each do
      @app = create(:application, step: 'investigation')
    end

    it 'should update app status' do
      Status.create(app_id: @app.id, name: Status.names[:start])
      request.session[:app_id] = @app.id
      patch "/applications/start",
            params: s_params
      expect(response).to redirect_to(offers_path)
    end
  end
end

我尝试用@request 替换request,两者的输出结果相同。

NoMethodError:
  undefined method `session' for nil:NilClass

然后我尝试设置为:

session[:app_id] = @app.id

这将产生:

NoMethodError:
  undefined method `session' for nil:NilClass

也可以这样设置:

patch "/applications/start",
      params: s_params,
      session: {"app_id" => @app.id}

这将产生:

 ArgumentError:
   unknown keyword: session

我的版本:

╰>>> ruby -v
ruby 2.4.5p335 (2018-10-18 revision 65137) [x86_64-darwin18]

╰>>> rails -v
Rails 5.2.1

╰>>> rspec -v
RSpec 3.8
  - rspec-core 3.8.0
  - rspec-expectations 3.8.1
  - rspec-mocks 3.8.0
  - rspec-rails 3.8.0
  - rspec-support 3.8.0

看看documentation,它表明我们可以利用会话,但没有给出一个明确的例子来说明我们将如何做到这一点。

【问题讨论】:

标签: ruby-on-rails session rspec


【解决方案1】:

首先,一点点评论......

我建议使用 'type:' 来定义 RSpec 测试。无论如何都很好:通过审查很容易确定,我们将能够为该类型的测试定义一些扩展/自定义(如果需要)。

第二点

我们在请求之前没有request / response / controller 方法(实例)。只有在请求之后,我们才会拥有它们。因此,在您的示例中,我们不能在 patch 之前使用 request.session[:app_id] = @app.id...

第三点

@app这是一个有风险的变量名,不确定是否有问题,但最好重命名它

一种可能的解决方案

您可以尝试使用一些存根,例如: allow_any_instance_of(ActionDispatch::Request).to receive(:session) { { app_id: '11' } }

备注

请求方法get / post / patch /等与类似的控制器测试方法不同。他们都通过process 方法处理。更多详情您可以找到here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多