Написание спецификации для помощника с Ruby on Rails и RSpec

Я писал спецификации для контроллеров и моделей, но я никогда не писал вспомогательную спецификацию. Я понятия не имею, с чего начать.

У меня есть следующий фрагмент в application_helper.rb

  def title(page_title)
    content_for(:title) { page_title }
  end
  • Как мне написать вспомогательную спецификацию в коде?
  • Кроме того, если есть какое-либо приложение Rails с открытым исходным кодом, чтобы показать хорошее вспомогательное тестирование/спецификацию, дайте мне знать.

person TK.    schedule 03.01.2010    source источник


Ответы (5)


RSpec должен автоматически загружать классы и модули из вашей среды rails, когда вы их «описываете», поэтому допустимой вспомогательной спецификацией может быть:

#deleted

Но помните, что bdd тестирует не каждый метод, а поведение вашего приложения.

редактировать:

как сказал @Ken, моя спецификация была неверной, это был определенно неправильный способ сделать это. Поэтому я придумал решение на основе спецификации запроса, которое мне нравится больше, чем спецификация помощника.

# inside your helper
def title=(page_title)
  content_for(:title) { page_title }
end

# views/resource/index.html.erb
<% title = "foo" %>

# views/layouts/application.html.erb
<%= yield :title %>

# request spec
require 'spec_helper'

describe YourResource do
  it "should output content for title"
    get "/resource"
    response.body.should =~ /<title>foo<\/title>/
  end
end

в противном случае, если вы хотите протестировать только поведение помощника (потому что это критично или потому, что у вас нет представлений), решение @Ken лучше.

person makevoid    schedule 03.01.2010
comment
Большое спасибо за ваш пример. Правильный BDD не охватывает все методы. Большинство вспомогательных методов затронуто покрытием Cucumber/Rcov. - person TK.; 04.01.2010
comment
Это мало что проверяет, так как content_for возвращает nil. Вы должны визуализировать страницу, а заголовок assert_select содержит то, что вы ожидаете. - person Ken Mayer; 17.04.2010
comment
Это не проверка помощника, это проверка чего-то другого, судя по вашему примеру, это похоже на проверку файла представления (например, index.html.erb). Вспомогательный тест должен просто тестировать сам метод ApplicationHelper#title, без каких-либо зависимостей от представления или маршрута/контроллера. - person Percy; 17.04.2013
comment
Обычно я не тестирую простые помощники представления, я предпочитаю спецификации запроса, потому что они проверяют поведение по сравнению с одной функциональностью. @KenMayer, я исправил код. - person makevoid; 21.04.2013

Из документов rspec-rails по спецификациям помощника:

Вспомогательные спецификации живут в spec/helpers и смешиваются с ActionView::TestCase::Behavior.

Предоставляет вспомогательный объект, который смешивается со специфицируемым вспомогательным модулем вместе с ApplicationHelper (если имеется).

require 'spec_helper'
describe ApplicationHelper do
  describe "#title" do
    it "displays the title" do
      # helper is an instance of ActionView::Base configured with the
      # ApplicationHelper and all of Rails' built-in helpers
      expect(helper.title).to match /Some Title/
    end
  end 
end
person plainjimbo    schedule 11.10.2012

Также возможно включить вашего помощника в тестовый класс следующим образом:

 describe ApplicationHelper do
   helper ApplicationHelper

   it "should work" do
     my_helper_method("xyz").should == "result for xyz"
   end
 end

Работал для меня с Rails 3.

person viphe    schedule 07.02.2011

Можно использовать этот синтаксис, когда спецификация помощники

Предположим, это ваш помощник

module ApplicationHelper
  def page_title
    @title || nil
  end
end

Затем вы можете указать его с помощью этого синтаксиса

require "spec_helper"

describe ApplicationHelper do
  describe "#page_title" do
    it "returns the instance variable" do
      assign(:title, "My Title")
      helper.page_title.should eql("My Title")
    end
  end
end
person Fabio    schedule 24.11.2011

Парсинг html с помощью регулярных выражений действительно изобретает велосипед. Для меня это слишком много работы: слишком негибко и слишком подвержено ошибкам. (См. этот саркастический, но веселый и точный ответ SO о рассуждениях)

Если вам нужно проанализировать вывод html вашими помощниками, вы можете попробовать gem rspec-html-matchers . В отличие от webrat, он хорошо работает с RSpec 3.

Тогда ты можешь:

expect(helper.title).to have_tag('title', text: 'What you expect')
person Loren    schedule 17.07.2015