22

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

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['...'] 存根?

谢谢。

4

5 回答 5

17

如果您正在使用rspec-rails,您也许可以controller.request在您的辅助测试中使用。

于 2013-03-31T21:19:32.327 回答
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
于 2012-04-12T21:53:47.830 回答
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
于 2013-04-06T02:20:07.983 回答
3

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

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

这将request.env["whatever"]在您的控制器中提供您在规格中提供的价值。

于 2019-10-04T18:54:04.923 回答
1

尝试这个:

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

于 2012-04-12T22:18:33.787 回答