2009-08-23 9 views
1

Ich habe dies in meinem application_helper.rb:Testing mit sanitize

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 

Als guten Rails Entwickler, ich habe versucht, einen Test für diese Methode zu schreiben:

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 

Wenn Ich gehe, um diesen Test zu laufen, aber ich bekomme diesen Fehler undefined method 'white_list_sanitizer' for Spec::Rails::Example::HelperExampleGroup::Subclass_1:Class

Dies ist, weil Spec::Rails::Example::HelperExampleGroup::Subclass_1:Class! = ActionView::Base. Wie teste ich diesen Code, der die Sanitize-Methode verwendet?

Antwort

1

Mixin-Spezifikationen gehen davon aus, dass Sie das Mixin isoliert testen wollen - also wird die Mischung in die Spezifikation eingemischt und Sie müssen sich über alle Methoden lustig machen, die sie erwarten. Also in diesem Fall könnten Sie Mock 'sanitize'

Aber hier sieht es so aus, als ob Sie tatsächlich testen möchten, dass das Aufrufen sanitize die Art, wie Sie Ergebnisse in dem Verhalten haben, wollen Sie, also wollen Sie nicht Ihre Helfer testen isoliert, sondern mit dem Ziel Objekt in integrierten ...

So erstellen Sie ein Objekt, das ActionView :: Base in der spec erstreckt, Ihre Helfer mixin und dann Ihre Angaben auf diesem Objekt läuft

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 
+0

Works, Danke vielmals! –