2009-08-23 61 views
1

我有这个在我application_helper.rb测试与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 

作为一个优秀的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。我如何测试使用清理方法的代码?

回答

1

Mixin规范假设您想要单独测试mixin - 因此混合是混合到规范中的,您需要嘲笑它们期望存在的任何方法。所以在这种情况下,你可以嘲笑'消毒'

但是,在这里它看起来像你真的想测试的调用消毒你的行为结果你想要的方式,所以你不想测试你的帮手在隔离,但与视图对象集成...

因此,创建一个扩展::的ActionView基地的规范对象,混入你的助手,然后该对象

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

作品上运行您的规格,非常感谢! – 2009-08-30 03:49:41