Подтвердить что ты не робот

Rspec: как специфицировать request.env в вспомогательной спецификации?

В моем вспомогательном модуле у меня есть:

def abc(url)
  ...
  if request.env['HTTP_USER_AGENT']
    do something
  end
end

В моем файле spec я:

  describe "#abc" do      
before(:each) do
  @meth = :abc

  helper.request.env['HTTP_USER_AGENT'] = "..."
end
it "should return the webstart jnlp file" do
  @obj.send(@meth, "some_url").should ....
end
end

Когда я запускаю spec, у меня есть эта ошибка:

undefined local variable or method `request' for <ObjectWithDocHelperMixedIn:0x00000103b5a7d0>

Как я закрою для request.env ['...'] в моих спецификациях?

Спасибо.

4b9b3361

Ответ 1

Если вы используете rspec-rails, вы можете использовать controller.request в своих вспомогательных тестах.

Ответ 2

Ну, вам почти ничего не нужно делать:

before(:each) do
  @meth = :abc

  request.env['HTTP_USER_AGENT'] = "..."
end

Я просто попробовал еще одну попытку, и это пройдет:

#in helper
def foo
  request.env['HTTP_USER_AGENT']
end

#spec
it "foo" do
  helper.request.env['HTTP_USER_AGENT'] = 'foo'
  expect(helper.foo).to eq 'foo'
end

Ответ 3

Вы можете переопределить пользовательский агент, установленный в запросе env, выполнив следующие действия.

before(:each) do
  @meth = :abc
  helper.request.user_agent = 'something else'
end

Затем в вашей спецификации:

it "does stuff" do
  expect(helper.send(@meth, "some_url")).to # ...
end

Ответ 4

Попробуйте следующее:

stub(request).env { {"HTTP_USER_AGENT" => "Some String"} }

Ответ 5

для тех, кто использует спецификации запроса вместо спецификаций контроллера и хочет установить request.env, можно сделать это следующим образом:

Rails.application.env_config["whatever"] = "whatever"

это сделает request.env["whatever"] доступным в ваших контроллерах со значением, которое вы дали в своих спецификациях.