在Rails集成测试中更改请求环境变量

时间:2010-06-17 17:50:53

标签: ruby-on-rails environment-variables integration-testing

我编写了一个功能测试,它会更改某些请求对象的环境变量,以模拟用户已登录。

require 'test_helper'
class BeesControllerTest < ActionController::TestCase

  # See that the index page gets called correctly.
  def test_get_index

    @request.env['HTTPS'] = "on"
    @request.env['SERVER_NAME'] = "sandbox.example.com"
    @request.env['REMOTE_USER'] = "joeuser" # Authn/Authz done via REMOTE_USER

    get :index
    assert_response :success
    assert_not_nil(assigns(:bees))
    assert_select "title", "Bees and Honey"
  end
end

功能测试工作正常。

现在我想做一些与集成测试相似的事情。这是我试过的:

require 'test_helper'
class CreateBeeTest < ActionController::IntegrationTest
  fixtures :bees

  def test_create
    @request.env['HTTPS'] = "on"
    @request.env['SERVER_NAME'] = "sandbox.example.com"
    @request.env['REMOTE_USER'] = "joeuser" # Authn/Authz done via REMOTE_USER

    https?

    get "/"
    assert_response :success
    [... more ...]
  end
end

我收到错误抱怨@request为零。我怀疑这与会话对象有关,但我不知道如何让它工作。

2 个答案:

答案 0 :(得分:3)

您可以使用

在集成测试中设置HTTPS
https!

并使用以下命令设置主机名:

host! "sandbox.example.com"

哪个可能等同于你想做的事情?

Rails指南Rails guides

中对此进行了描述

答案 1 :(得分:0)

您可以通过参数将请求变量更改为post方法。

对于您的情况,方法 test_create 将是:

def test_create
  https!

  get "/", nil, { 'SERVER_NAME'] => "sandbox.example.com", 'REMOTE_USER'] => "joeuser" }

  assert_response :success
  [... more ...]
end

同样适用于将请求设置为原始数据:

post root_path, nil, { 'RAW_POST_DATA' => 'some string' }