2011-01-19 35 views
1

我試圖讓assert_select在一些原始文本上工作。以下是我的,但是當我執行選擇它說沒有匹配。我還連接從assert_select方法,其示出了受理HTML :: Node對象是可行的(I也曾嘗試包裹提取HTML中的HTML /體標記)的一個片段有沒有辦法在某些自定義HTML文本上使用assert_select?

# Controller test 
test "edit form contains all required fields" do 
    group = groups(:a_group) 
    user = users(:group_member) 
    post = create_post(user, :group_ids => group.id) 

    xhr :get, :edit, {:id => post.id}, {:user_id => user.id} 
    node = convert_js_to_node(@response.body, "form") 
    puts node.inspect 
    assert_select node, "form" 
    assert_select node, "input[type=text]" 
end 


# test_helper.rb method 
def convert_js_to_node(js, enclosing_tag) 
    regex = Regexp.new("(\<#{enclosing_tag}.*#{enclosing_tag}\>)") 
    HTML::Node.new(js.match(regex)[0]) 
end 

## Test output 
Loaded suite functional/posts_controller_test 
Started 
#<HTML::Node:0x1050e6040 @line=0, @children=[], @parent="<form accept-charset=\\\"UTF-8\\\" action=\\\"/posts/1023110311\\\" class=\\\"edit_post\\\" data-post-id=\\\"1023110311\\\" data-remote=\\\"true\\\" id=\\\"edit_post_1023110311\\\" method=\\\"post\\\"><div style=\\\"margin:0;padding:0;display:inline\\\"><input name=\\\"utf8\\\" type=\\\"hidden\\\" value=\\\"&#x2713;\\\" /><input name=\\\"_method\\\" type=\\\"hidden\\\" value=\\\"put\\\" /><\\/div>\\n\t\t<h3>Edit post<\\/h3>\\n\t\t<h5><img alt=\\\"Contact\\\" class=\\\"icon\\\" height=\\\"16\\\" src=\\\"/images/contact.png?1288409655\\\" width=\\\"16\\\" /> in some where<\\/h5>\\n\t\t\t\\n\t\t<div id=\\\"post_content\\\" class=\\\"clearfix clear\\\" 

    1) Failure: 
test_edit_form_contains_all_required_fields(PostsControllerTest) 
    []: 
Expected at least 1 element matching "form", found 0. 
<false> is not true. 

# File actionpack/lib/action_controller/assertions/selector_assertions.rb, line 201 
def assert_select(*args, &block) 
    # Start with optional element followed by mandatory selector. 
    arg = args.shift 

    if arg.is_a?(HTML::Node) 
    # First argument is a node (tag or text, but also HTML root), 
    # so we know what we're selecting from. 
    root = arg 
    arg = args.shift 
    elsif arg == nil 
    ... 
+0

可能重複[你怎麼能執行功能測試JavaScript的響應?](http://stackoverflow.com/questions/4856295/how-can-you-perform-functional-tests-on-javascript-responses) – chris 2011-02-05 19:31:05

回答

1

這是我放在一起。這不是完美的,但它做到了我所需要的。

# allows for a method similar the native assert_select method to be performed 
# on raw html text that is embedded within javascript code. 
# ex. 
# $('body').append("<div id=\"edit_post_form_container\" class=\"active modal_form_container\"> 
#  <a href=\"#\" class=\"close\"> 
#  <img alt=\"Close\" height=\"16\" src=\"/images/close.png?1293730609\" width=\"16\" /> 
#  <\/a> 
#  <form accept-charset=\"UTF-8\" action=\"/posts/1023110335\" .../>") 
# 
# To test for the closing link image: 
# => assert_js_select("img[alt=Close]") 
# To be more specific you can include a parent tag: 
# => assert_js_select("img[alt=Close]", "a") 
# 
# Note: The parent_tag parameter cannot include any attribute or style selectors since 
#  the initial extraction of the html section is done using a regular expression. 
def assert_js_select(tag, content=nil, options={}) 
    text = options[:text] || @response.body 
    parent_tag = options[:parent_tag] || "" 
    regex = Regexp.new("(\<#{parent_tag}.*#{parent_tag}\>)") 
    extracted_text = text.match(regex)[0].gsub(/\\/, "") 
    if extracted_text.present? 
    doc = HTML::Document.new(CGI::unescapeHTML(extracted_text)).root 
    assert_select(doc, tag, content) 
    else 
    assert false, "Missing #{tag} tag" 
    end 
end 
+0

更好的答案可以在http:// stackoverflow找到.com/questions/4856295/how-can-you-performing-functional-tests-on-javascript-responses/4909123#4909123我問了一個更清晰的上下文問題,希望得到更好的答案,因爲這個問題已被讀取y標記爲已回答。 – chris 2011-02-05 19:28:45

1

使用Rails 4.x的,這對我的作品(關鍵是要重寫規範/測試期間「document_root_element」方法):

context "with assert_select" do 
    def document_root_element 
    Nokogiri::HTML::Document.parse(@html).root 
    end 

    it "selects" do 
    @html = "<html></html>" 
    assert_select("html", count: 1) # should work! 
    end 
end 
相關問題