2010-01-03 3 views
20

Я писал спецификации для контроллеров и моделей, но я никогда не писал вспомогательную спецификацию. Я не знаю, с чего начать.Написание спецификации для помощника с Ruby on Rails и RSpec

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

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

ответ

6

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 

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

+0

Спасибо так много для вашего примера. Правый BDD не связан с каждым методом. Большинство вспомогательных методов затрагивается охватом огурцов/риков. –

+4

Это не очень много значит, так как content_for возвращает nil. Вы должны отобразить страницу, а assert_select «title» содержит то, что вы ожидаете. –

+1

Это не тестирование помощника, это тестирование чего-то еще, на основе вашего примера, похоже, что он тестирует файл вида (например, index.html.erb). Хелпер-тест должен просто протестировать сам метод заголовка ApplicationHelper # без каких-либо зависимостей от представления или маршрута/контроллера. – Percy

10

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

describe ApplicationHelper do 
    helper ApplicationHelper 

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

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

9

можно использовать this syntax когда spec'ing хелперы

Пусть это ваш помощник

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 
17

rspec-rails docs on Helper Specs От:

Helper спецификации живут в спецификации/хелперов, и смешайте в 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 
+0

Это должен быть ответ, * спасибо * –

1

Синтаксический HTML с использованием регулярных выражений действительно изобретать колесо. Для меня это слишком много работает: слишком негибкий и слишком склонный к ошибкам. (См. Это sarcastic but hilarious and accurate SO answer о причинах)

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

Тогда вы можете:

expect(helper.title).to have_tag('title', text: 'What you expect') 
Смежные вопросы