Rspec:如何在helper规范中规范request.env?

Rou*_*oon 20 user-agent specifications rspec ruby-on-rails request

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

def abc(url)
  ...
  if request.env['HTTP_USER_AGENT']
    do something
  end
end
Run Code Online (Sandbox Code Playgroud)

在我的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
Run Code Online (Sandbox Code Playgroud)

当我运行规范时,我有这个错误:

undefined local variable or method `request' for <ObjectWithDocHelperMixedIn:0x00000103b5a7d0>
Run Code Online (Sandbox Code Playgroud)

如何在我的规范中存根request.env ['...']?

谢谢.

Chr*_*ele 15

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


apn*_*ing 11

好吧,你几乎无事可做:

before(:each) do
  @meth = :abc

  request.env['HTTP_USER_AGENT'] = "..."
end
Run Code Online (Sandbox Code Playgroud)

我刚刚给了另一个尝试,这传递了:

#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
Run Code Online (Sandbox Code Playgroud)

  • 一个简单的解决方法是将条件提取到助手中的方法并存根这些方法 (2认同)

jla*_*ieu 5

您可以通过执行以下操作覆盖请求env中的用户代理集.

before(:each) do
  @meth = :abc
  helper.request.user_agent = 'something else'
end
Run Code Online (Sandbox Code Playgroud)

然后,在您的规范中:

it "does stuff" do
  expect(helper.send(@meth, "some_url")).to # ...
end
Run Code Online (Sandbox Code Playgroud)