給定一個控制器,它與響應:如何檢查來自Rails的Capybara AJAX響應?
render json:{ errors: [] }
如何測試一個AJAX調用此響應?
expect(page.body).to have_content { errors:[] }.to_json
這不起作用,因爲它似乎是檢查頁面它使AJAX調用,而不是從AJAX調用響應之前。
有沒有辦法從AJAX調用中檢查響應的主體?
給定一個控制器,它與響應:如何檢查來自Rails的Capybara AJAX響應?
render json:{ errors: [] }
如何測試一個AJAX調用此響應?
expect(page.body).to have_content { errors:[] }.to_json
這不起作用,因爲它似乎是檢查頁面它使AJAX調用,而不是從AJAX調用響應之前。
有沒有辦法從AJAX調用中檢查響應的主體?
據我所知,有沒有簡單的方法來做你想做的。
當您使用Capybara測試您的AJAX功能時,通常認爲您的AJAX請求會對您的HTML頁面執行某些操作,並且您需要檢查頁面上的更改,而不是檢查請求的響應。
如果您想直接檢查響應,您應該可以通過直接發送並檢查您的測試中的AJAX請求來單獨進行測試。
這就是說,你應該能夠使用一些技巧來實現你的最初目標。例如,you may want to try the execute_script
method。老實說,雖然我不認爲這是值得的努力。
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網站和谷歌搜索之間, 您應該能夠了解如何根據您的需求對其進行定製。 祝你好運!
看來問題不在於JSON,而在於水豚。我認爲他們正在使用機架測試。 – 2015-03-14 00:49:55
是的,我認爲有一個單獨的AJAX測試,但然後我會有同樣的事情,這似乎不是很優雅2測試。 – 2015-03-13 19:52:03
@BSeven,我真的不覺得這裏會有什麼不雅。畢竟,你應該有單元測試,但你也應該有集成測試。而且你的集成測試通常檢查與單元測試相同的東西,不是嗎? – Alexis 2015-03-14 13:43:43