2009-08-23 8 views
1

J'ai dans mon application_helper.rb:Test avec 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 

Comme un bon développeur Rails, j'ai essayé d'écrire un test pour cette méthode:

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 

Lorsque Je vais exécuter ce test mais je reçois cette erreur undefined method 'white_list_sanitizer' for Spec::Rails::Example::HelperExampleGroup::Subclass_1:Class

C'est parce que Spec::Rails::Example::HelperExampleGroup::Subclass_1:Class! = ActionView::Base. Comment puis-je tester ce code qui utilise la méthode de nettoyage?

Répondre

1

Les caractéristiques de Mixin supposent que vous voulez tester le mixin de manière isolée - de sorte que le mixage est mélangé à la spécification et vous auriez besoin de se moquer de toutes les méthodes qu'ils attendent d'être là. Dans ce cas, vous pouvez simuler «désinfecter»

Cependant, il semble que vous souhaitiez réellement tester cet appel, désinfectez la manière dont vous obtenez les résultats souhaités. Vous ne voulez donc pas tester votre assistant. l'isolement, mais intégré à un objet vue ...

, créez un objet qui étend ActionView :: base dans vos spécifications, mixin votre aide et puis exécutez vos spécifications sur cet objet

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, Merci beaucoup! –