Тестирование с дезинфекцией - PullRequest
1 голос
/ 23 августа 2009

У меня есть это в моем application_helper.rb :

def bbcode(text)
  # Code snippets
  text.gsub!(/\[code=?["']?(.*?)["']?\](.*?)\[\/code\]/mis) { CodeRay.scan($2.strip, $1.to_sym).div(:line_numbers => :table)}
  text = sanitize(text, :tags => %w(span div table tr td br pre tt), :attributes => %w(id class style))
  # Gist embedding
  text.gsub!(/\[gist\](.*?)\[\/gist\]/) { $1.split(" ").map { |gist| "<script src='http://gist.github.com/#{gist}.js'></script>" } }

  # allows for nested quotes
  bbquote(text)

  # non-attributed quote
  text.gsub!(/\[quote\](.*?)\[\/quote\]/mis) { "<div class='center'><div class='quote'>" << $1 << "</div></div>" }

  # Terminal example
  text.gsub!(/\[term\](.*?)\[\/term\]/mi) { "<span class='term'>" << $1.gsub(/^\r\n/,"").gsub("<","&lt;").gsub(">","&gt;") << "</span>" }

  # URLs
  text.gsub!(/\[url=["']?(.*?)["']?\](.*?)\[\/url\]/mis) { "<a rel='nofollow' href='" << $1 << "'>" << $2 << "</a>" }

  # handle with care...
  bbcode_ext(text)
end

Как хороший разработчик Rails, я попытался написать тест для этого метода:

require File.dirname(__FILE__) + '/../spec_helper'
describe ApplicationHelper, "general" do
  include ApplicationHelper
  it "should correctly encapsulate double quotes" do
    bbcode('[quote="Kitten"][quote="Dog"]QUOTE INSIDE[/quote]QUOTE OUTSIDE[/quote]').should eql("<div class='center'><div class='quote'><b>Kitten wrote:</b><div class='center'><div class='quote'><b>Dog wrote:</b></div></div>QUOTE OUTSIDE</div></div>")
  end
end  

Когда я иду, чтобы запустить этот тест, однако я получаю эту ошибку undefined method 'white_list_sanitizer' for Spec::Rails::Example::HelperExampleGroup::Subclass_1:Class

Это потому, что Spec::Rails::Example::HelperExampleGroup::Subclass_1:Class! = ActionView::Base. Как проверить этот код, который использует метод sanitize?

1 Ответ

1 голос
/ 30 августа 2009

Спецификации Mixin предполагают, что вы хотите протестировать миксин изолированно - поэтому микширование смешивается со спецификацией, и вам нужно будет высмеивать любые методы, которые они там ожидают. Таким образом, в этом случае вы могли бы издеваться над «дезинфицировать»

Тем не менее, здесь, похоже, вы действительно хотите проверить, что вызов sanitize соответствует вашему желаемому поведению, поэтому вы не хотите тестировать свой помощник изолированно, а интегрированы с объектом представления. .

Итак, создайте объект, который расширяет ActionView :: Base в вашей спецификации, смешайте ваш помощник и затем запустите ваши спецификации для этого объекта

class AView < ActionView::Base
   include ApplicationHelper
end

describe AView, "general" do

  it "should correctly encapsulate double quotes" do
    AView.new.bbcode('[quote="Kitten"][quote="Dog"]QUOTE INSIDE[/quote]QUOTE OUTSIDE[/quote]').should eql("<div class='center'><div class='quote'><b>Kitten wrote:</b><div class='center'><div class='quote'><b>Dog wrote:</b></div></div>QUOTE OUTSIDE</div></div>")
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...