2015-03-13 34 views
0

給定一個控制器,它與響應:如何檢查來自Rails的Capybara AJAX響應?

render json:{ errors: [] } 

如何測試一個AJAX調用此響應?

expect(page.body).to have_content { errors:[] }.to_json 

這不起作用,因爲它似乎是檢查頁面它使AJAX調用,而不是從AJAX調用響應之前。

有沒有辦法從AJAX調用中檢查響應的主體?

回答

3

據我所知,有沒有簡單的方法來做你想做的。

當您使用Capybara測試您的AJAX功能時,通常認爲您的AJAX請求會對您的HTML頁面執行某些操作,並且您需要檢查頁面上的更改,而不是檢查請求的響應。

如果您想直接檢查響應,您應該可以通過直接發送並檢查您的測試中的AJAX請求來單獨進行測試。

這就是說,你應該能夠使用一些技巧來實現你的最初目標。例如,you may want to try the execute_script method。老實說,雖然我不認爲這是值得的努力。

+0

是的,我認爲有一個單獨的AJAX測試,但然後我會有同樣的事情,這似乎不是很優雅2測試。 – 2015-03-13 19:52:03

+0

@BSeven,我真的不覺得這裏會有什麼不雅。畢竟,你應該有單元測試,但你也應該有集成測試。而且你的集成測試通常檢查與單元測試相同的東西,不是嗎? – Alexis 2015-03-14 13:43:43

1

Thoughtbot對如何做到這一點的出色答卷:

首先,添加json-schema寶石到的Gemfile:

# Gemfile 
gem 'json-schema', groups: [:test] 

接下來,我們載入我們的匹配器:

# spec/support/api/json_schema_matcher.rb 
RSpec::Matchers.define :match_response_schema do |schema| 
    match do |response| 
    schema_directory = "#{Dir.pwd}/spec/support/api/schemas" 
    schema_path = "#{schema_directory}/#{schema}.json" 
    JSON::Validator.validate!(schema_path, response.body, strict: true) 
    end 
end 

然後我們定義我們的模式(spec/support/api/schema/empty_errors.json):

{ 
    "type": "object", 
    "required": ["errors"], 
    "properties": { 
    "errors": { 
     "type": "array", 
     "properties": {"items":[],"minItems": 0, "additionalItems": false} 
    } 
    } 
} 

最後,我們可以匹配器添加到我們的測試(TB使用RSpec的,相應調整):

expect(response.status).to eq 200 
    expect(response).to match_response_schema("empty_errors") # or whatever the bigger schema you define is called 

參觀JSON Schema現場爲完整的技術定義, 但thoughtbot網站和谷歌搜索之間, 您應該能夠了解如何根據您的需求對其進行定製。 祝你好運!

+0

看來問題不在於JSON,而在於水豚。我認爲他們正在使用機架測試。 – 2015-03-14 00:49:55