Как смоделировать объект запроса для вспомогательных тестов rspec? - PullRequest
22 голосов
/ 27 октября 2010

У меня есть вспомогательный метод view, который генерирует URL, просматривая 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>`

Может кто-нибудь, пожалуйста, помогите мне разобраться, что я должен сделать, чтобы это исправить?Как я могу смоделировать объект 'request' для этого примера?

Существуют ли более эффективные способы создания URL-адресов при использовании поддоменов?

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

Ответы [ 4 ]

22 голосов
/ 08 ноября 2010

Необходимо добавить вспомогательный метод с помощью '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
11 голосов
/ 04 мая 2012

Это не полный ответ на ваш вопрос, но для записи, вы можете смоделировать запрос, используя 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
8 голосов
/ 08 июня 2011

У меня была похожая проблема, я нашел это решение для работы:

before(:each) do
  helper.request.host = "yourhostandorport"
end
0 голосов
/ 29 октября 2010

Проверьте скринкаст Railscasts о поддоменах в рельсах 3: http://railscasts.com/episodes/221-subdomains-in-rails-3

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

...