Как издеваться над объектом запроса для вспомогательных тестов rspec?
У меня есть вспомогательный метод представления, который генерирует 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-адресов, в которых используются поддомены?
Спасибо заранее.
Ответы
Ответ 1
Вы должны добавить метод helper с помощью "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
Ответ 2
Это не полный ответ на ваш вопрос, но для записи вы можете издеваться над запросом, используя 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
Ответ 3
У меня была аналогичная проблема, я нашел это решение для работы:
before(:each) do
helper.request.host = "yourhostandorport"
end
Ответ 4
Проверьте railscasts screencast о субдоменах в рельсах 3: http://railscasts.com/episodes/221-subdomains-in-rails-3
Это должно помочь вам понять, как они работают, и, возможно, изменить способ, которым вы сами пытаетесь сделать эти помощники.