web-dev-qa-db-ja.com

rspecヘルパーテストのリクエストオブジェクトをモックする方法は?

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

誰かが私がこれを修正するために何をすべきかを理解するのを手伝ってくれますか?この例の「request」オブジェクトをモックするにはどうすればよいですか?

サブドメインが使用されているURLを生成するためのより良い方法はありますか?

前もって感謝します。

23
BuddhiP

ヘルパーメソッドの前に「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
22
Netzpirat

これはあなたの質問に対する完全な答えではありませんが、記録のために、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
11
seb

私は同様の問題を抱えていました、私はこの解決策が機能することを発見しました:

before(:each) do
  helper.request.Host = "yourhostandorport"
end
8
23inhouse

これは私のために働いた:

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