2011-01-31 54 views
0

我注意到,在js請求中使用jquery方法調用中嵌入的文本將其插入到DOM中,這在Rails中很常見。如何對JavaScript響應進行功能測試?

// javascript code 
$.getScript("/some_url"); 

// rails partial code, to make things more clear I have added some simple html 
$("#some_id").text(unescape_javascript('<div id="foo">bar</div>')) 

我的問題是你如何執行assert_select,或等效,在這樣的響應文本的功能測試?

// 
class FooBarControllerTest < ... 
    test "javascript response" do 
    xhr :get, :new 
    // how could I test the div here 
    assert_select "#foo", "bar" // this doesn't work 
    end 
end 

**更新代碼以使其更清晰

+0

* *作爲來自另一端的字符串,然後作爲普通腳本運行它? – FeRtoll 2011-01-31 21:27:15

+0

是的。部分內生成的代碼將在客戶端執行。 – chris 2011-01-31 21:28:58

回答

2

經過一些擺弄這個作品對我來說。最棘手的部分是在創建HTML :: Document對象之前清除所有分隔字符,如\ t,\ n和\。

# wrapper method around the native assert_select method that extracts out the html 
# from 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\" .../>") 
# 
# assert_js_select "input[type=?][name=?]", "text", "foo[bar]", :count => 1 
# assert_js_select "textarea", "Some long text" 
# assert_js_select "textarea[name=?]", "post_text", "Some long text" 
# assert_js_select "textarea[name=?][class=?]", ["post_text", "css_class", "Some long text" 
def assert_js_select(*args, &block) 
    extracted_text = @response.body.match(/(\<.*\>)/)[0]. 
    gsub("\\n", "").gsub("\\t", "").gsub(/\\"/, '"').gsub("\\", '') 
    if extracted_text.present? 
    doc = HTML::Document.new(CGI::unescapeHTML(extracted_text)).root 
    args.insert(0, doc) 
    assert_select(*args, &block) 
    else 
    assert false, "Unable to extract any html from the js code." 
    end 
end 
0

我不知道你怎麼會從軌,但使用Ajax和jQuery請求它會是這樣的:你需要

$.ajax({ 
     type: 'POST', 
     url: 'getstring.php', 
     data: '', 
     success: function(server_response){ 
      if(server_response){ 
       eval(server_response); 
      } 
      else{ 

      } 
     } 
    }); 

事是eval,所以只要把你的字符串hawe被視爲JavaScript內的eval();

+0

問題在於如何在ruby中執行類似測試的assert_select。即assert_select「#some_id」,「富吧」 – chris 2011-01-31 21:51:38

0

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

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

    it "works" do 
    xhr :get, :new 
    @html = response.body # or wherever the response HTML comes from 
    assert_select "#foo", "bar" # should work now 
    end 
end 
相關問題