Подтвердить что ты не робот

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

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

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

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

Ответ 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')