2010-10-27 2 views
19

У меня есть вспомогательный метод представления, который генерирует URL-адрес, просматривая request.domain и request.port_string.Как обмануть объект запроса для rspec вспомогательных тестов?

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-адресов, где используются поддомены?

Заранее спасибо.

ответ

21

Вы должны предварять вспомогательный метод с «помощником»:

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 
+2

Ошибка: Исключено: # shailesh

0

ЗАКАНЧИВАТЬ Railscasts скринкасто о субдоменах в рельсах 3: http://railscasts.com/episodes/221-subdomains-in-rails-3

Это должно помочь вам получить представление о том, как они работают, и, возможно, изменить так, как вы пытаетесь сделать этим Помощник с себя.

7

I имел такую ​​же проблему, я нашел это решение для работы:

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

Для меня в контроллере он работал с 'контроллером. request.host = "http://test_my.com/" ' – AnkitG

9

Это не полный ответ на ваш вопрос, но для записи вы можете высмеять запрос, используя 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 
+0

Не могли бы вы уточнить? –