25

我有一个查看助手方法,它通过查看request.domain 和request.port_string 来生成一个url。

   module ApplicationHelper  
       def root_with_subdomain(subdomain)  
           subdomain += "." unless subdomain.empty?    
           [subdomain, request.domain, request.port_string].join  
       end  
   end  

我想用 rspec 测试这个方法。

describe ApplicationHelper do
  it "should prepend subdomain to host" do
    root_with_subdomain("test").should = "test.xxxx:xxxx"
  end
end

但是当我用 rspec 运行它时,我得到了这个:

 Failure/Error: root_with_subdomain("test").should = "test.xxxx:xxxx"
 `undefined local variable or method `request' for #<RSpec::Core::ExampleGroup::Nested_3:0x98b668c>`

谁能帮我弄清楚我应该怎么做才能解决这个问题?如何模拟此示例的“请求”对象?

有没有更好的方法来生成使用子域的 url?

提前致谢。

4

4 回答 4

23

您必须在辅助方法前面加上“helper”:

describe ApplicationHelper do
  it "should prepend subdomain to host" do
    helper.root_with_subdomain("test").should = "test.xxxx:xxxx"
  end
end

此外,为了测试不同请求选项的行为,您可以通过控制器访问请求对象:

describe ApplicationHelper do
  it "should prepend subdomain to host" do
    controller.request.host = 'www.domain.com'
    helper.root_with_subdomain("test").should = "test.xxxx:xxxx"
  end
end
于 2010-11-08T14:27:47.630 回答
12

这不是您问题的完整答案,但为了记录,您可以使用ActionController::TestRequest.new(). 就像是:

describe ApplicationHelper do
  it "should prepend subdomain to host" do
    test_domain = 'xxxx:xxxx'
    controller.request = ActionController::TestRequest.new(:host => test_domain)
    helper.root_with_subdomain("test").should = "test.#{test_domain}"
  end
end
于 2012-05-04T11:24:57.367 回答
8

我有一个类似的问题,我发现这个解决方案有效:

before(:each) do
  helper.request.host = "yourhostandorport"
end
于 2011-06-08T02:13:41.823 回答
0

这对我有用:

expect_any_instance_of(ActionDispatch::Request).to receive(:domain).exactly(1).times.and_return('domain')
于 2020-01-22T11:40:58.030 回答