Как включить маршрутизацию в спецификацию ApplicationHelper при запуске через Spork?

У меня есть спецификация rspec:

require "spec_helper"

describe ApplicationHelper do
  describe "#link_to_cart" do
    it 'should be a link to the cart' do
      helper.link_to_cart.should match /.*href="\/cart".*/
    end
  end
end

И помощник приложения:

module ApplicationHelper
  def link_to_cart
    link_to "Cart", cart_path
  end
end

Это работает при посещении сайта, но спецификации не работают с ошибкой RuntimeError о недоступности маршрутизации:

RuntimeError:
   In order to use #url_for, you must include routing helpers explicitly. For instance, `include Rails.application.routes.url_helpers

Итак, я включил в свою спецификацию Rails.application.routes.url, файл spec_helper и даже сам ApplicationHelper, но безрезультатно.

Изменить: я запускаю тесты через spork, возможно, это связано с этим и вызывает проблему.

Как я должен включить эти помощники маршрута при работе со Spork?


person berkes    schedule 16.04.2013    source источник


Ответы (3)


Вам нужно добавить include на уровне модуля ApplicationHelper, потому что ApplicationHelper по умолчанию не включает вспомогательную функцию URL. Такой код

module AppplicationHelper
  include Rails.application.routes.url_helpers

  # ...
  def link_to_cart
    link_to "Cart", cart_path
  end

 end

Тогда код будет работать и ваш тест пройдет.

person Billy Chan    schedule 17.04.2013
comment
Я уже пробовал это, и тест не проходит: сообщение об ошибке остается прежним. - person berkes; 17.04.2013
comment
@berkes, я уже проверил это в своей консоли, прежде чем публиковать ответ. Оно работает. В вашем вопросе я видел, что вы упомянули только его включение в тест, но не модуль ApplicationHelper. Это неправильно. - person Billy Chan; 17.04.2013
comment
Это тоже НЕ ApplicationController, а ApplicationHelper - person Billy Chan; 17.04.2013
comment
Моя ошибка; ошибка в вопросе, но это мало что меняет в моей проблеме. Я подозреваю, что проблема здесь в spork, и я попытаюсь убрать это и повторно протестировать. - person berkes; 17.04.2013
comment
@berkes, я использую не Spork, а обычный Rspec. Я только что написал тест помощника для статической страницы в том же коде. И это прошло. Не уверен, почему вы получили ошибку. - person Billy Chan; 17.04.2013
comment
любая идея о том, как включить помощник приложения в инициализатор:: stackoverflow.com/questions/23035947/ - person Chris Hough; 13.04.2014

Если вы используете spork с rspec, вы должны добавить метод url_helper в вашу конфигурацию rspec -

Внутри вашего файла '/spec/spec_helper':

RSpec.configure do |config|
.
. =begin
. bunch of stuff here, you can put the code 
. pretty much anywhere inside the do..end block
. =end
config.include Rails.application.routes.url_helpers
.
. #more stuff
end

это загружает встроенный ApplicationHelper под названием «Routes» и вызывает метод «#url_helpers» в RSpec. Нет необходимости добавлять его в ApplicationHelper в '/app/helpers/application_helper.rb' по двум причинам:

1) Вы просто копируете функциональность маршрутов в место, где она не нужна, по сути, контроллер, который уже наследует ее от ActionController::Base (я думаю, может быть, ::Metal, сейчас не важно). так что ты не СУХОЙ - не повторяйся

2) Эта ошибка специфична для конфигурации RSpec, исправьте ее там, где она сломана (мой собственный маленький афоризм)

Далее, я бы порекомендовал немного исправить ваш тест. Попробуй это:

require "spec_helper"

describe ApplicationHelper do
  describe "#link_to_cart" do
    it 'should be a link to the cart' do
     visit cart_path 
     expect(page).to match(/.*href="\/cart".*/)
    end
  end
end

Я надеюсь, что это полезно для кого-то!

person gekken    schedule 06.07.2013

Я использовал guard с spring и обнаружил, что в моем случае проблема была вызвана пружиной. После запуска spring stop это было исправлено. Но иногда это повторяется, когда я что-то меняю в ApplicationController.

person Darme    schedule 13.03.2015