Написание спецификации для помощника с Ruby on Rails и RSpec
Я пишу спецификации для контроллеров и моделей, но я никогда не писал вспомогательную спецификацию. Я не знаю, с чего начать.
У меня есть следующий фрагмент в application_helper.rb
def title(page_title)
content_for(:title) { page_title }
end
- Как мне написать вспомогательную спецификацию в коде?
- Также, если есть приложение с открытым исходным кодом Rails, чтобы показать хорошее тестирование/спецификацию помощника, дайте мне знать.
Ответы
Ответ 1
RSpec должен автоматически загружать классы и модули из вашей среды рельсов, когда вы их описываете, поэтому действительная вспомогательная спецификация может быть:
#deleted
Но помните, что bdd не тестирует каждый метод, а поведение вашего приложения.
изменить:
как сказал @Ken, моя спецификация была неправильной, это был определенно неправильный способ сделать это. Поэтому я вышел с решением спецификации запроса, которое мне больше, чем спецификации Helper.
# 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.
Ответ 2
Из rspec-rails docs по спецификациям помощника:
Спецификации помощника живут в spec/helpers и смешиваются в ActionView:: TestCase:: Поведение.
Предоставляет вспомогательный объект, который смешивается в вспомогательном модуле, являющемся spec'd, вместе с 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
Ответ 3
Также можно включить ваш помощник внутри тестового класса следующим образом:
describe ApplicationHelper do
helper ApplicationHelper
it "should work" do
my_helper_method("xyz").should == "result for xyz"
end
end
Работал для меня с Rails 3.
Ответ 4
Можно использовать этот синтаксис, когда specsing helpers
Предположим, что это ваш помощник
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
Ответ 5
Разбор html с регулярными выражениями действительно изобретает колесо. Для меня это слишком много работает: слишком негибкая и слишком склонная к ошибкам. (См. Этот саркастический, но веселый и точный SO ответ о рассуждениях)
Если вам нужно проанализировать вывод html вашими помощниками, вы можете попробовать gem rspec-html-matchers. В отличие от webrat, он, похоже, хорошо работает с RSpec 3.
Затем вы можете:
expect(helper.title).to have_tag('title', text: 'What you expect')