Rspec:如何在helper spec中测试request.env?

24

在我的辅助模块中,我有:

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

在我的规范文件中,我有:

  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

当我运行这个规范时,我遇到了这个错误:

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

我该如何在我的测试中为request.env['...']进行桩测试?

谢谢。

5个回答

17

如果您正在使用rspec-rails,则您可能可以在辅助器测试中使用controller.request


11

好吧,你几乎什么也不用做:

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

我通常在控制器规范中这样做...从未尝试过在助手规范中。 - apneadiving
谢谢您的回复。是的,我之前也尝试过,但在辅助测试中它没有起作用(至少在我的情况下)。 - RoundOutTooSoon
2
一个简单的解决方法是将条件提取到您的帮助程序中的方法中,并存根这些方法。 - apneadiving

5
您可以通过以下方式覆盖请求环境中设置的用户代理。
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

对于那些使用请求规范(request specs)而不是控制器规范(controller specs)并想设置request.env的人,可以像这样做:

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

这将使得在你的控制器中可以使用request.env["whatever"],其值与你在测试用例中所赋的相同。


1
试试这个:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接