如何模拟rspec辅助测试的请求对象?

时间:2010-10-27 03:59:24

标签: ruby-on-rails ruby-on-rails-3 rspec rspec2 view-helpers

我有一个视图辅助方法,通过查看request.domain和request.port_string来生成网址。

   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>`

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

有没有更好的方法来生成使用子域名的网址?

提前致谢。

5 个答案:

答案 0 :(得分:22)

你必须在'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

答案 1 :(得分:11)

这不是您问题的完整答案,但是对于记录,您可以使用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

答案 2 :(得分:8)

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

before(:each) do
  helper.request.host = "yourhostandorport"
end

答案 3 :(得分:0)

这对我有用:

expect_any_instance_of(ActionDispatch::Request).to receive(:domain).exactly(1).times.and_return('domain')

答案 4 :(得分:-1)

查看有关rails 3中的子域名的railscasts截屏视频:http://railscasts.com/episodes/221-subdomains-in-rails-3

它应该可以帮助您了解它们的工作原理,并可能改变您自己尝试帮助这些帮助的方式。