Ruby on rails 如何检查来自Rails的Capybara AJAX响应?
给定一个控制器,其响应为:Ruby on rails 如何检查来自Rails的Capybara AJAX响应?,ruby-on-rails,ruby,rspec,capybara,Ruby On Rails,Ruby,Rspec,Capybara,给定一个控制器,其响应为: render json:{ errors: [] } 如何测试此响应的AJAX调用 expect( page.body ).to have_content { errors:[] }.to_json 这不起作用,因为它似乎是在进行AJAX调用之前检查页面,而不是来自AJAX调用的响应 有没有办法检查AJAX调用的响应主体?据我所知,没有一种简单的方法可以满足您的需求 当您使用Capybara测试AJAX特性时,通常认为AJAX请求对HTML页面有作用,您需要检查页
render json:{ errors: [] }
如何测试此响应的AJAX调用
expect( page.body ).to have_content { errors:[] }.to_json
这不起作用,因为它似乎是在进行AJAX调用之前检查页面,而不是来自AJAX调用的响应
有没有办法检查AJAX调用的响应主体?据我所知,没有一种简单的方法可以满足您的需求 当您使用Capybara测试AJAX特性时,通常认为AJAX请求对HTML页面有作用,您需要检查页面上的更改,而不是请求的响应 如果您想直接检查响应,您应该能够通过直接发送和检查测试中的AJAX请求来单独测试它
也就是说,你应该能够使用一些技巧来实现你最初的目标。例如老实说,尽管我认为这不值得努力。据我所知,要想做你想做的事,没有简单的方法 当您使用Capybara测试AJAX特性时,通常认为AJAX请求对HTML页面有作用,您需要检查页面上的更改,而不是请求的响应 如果您想直接检查响应,您应该能够通过直接发送和检查测试中的AJAX请求来单独测试它 也就是说,你应该能够使用一些技巧来实现你最初的目标。例如老实说,虽然我认为不值得这么做。对于如何做到这一点有一个很好的答案: 首先,将
json模式
gem添加到gem文件中:
# 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\u errors.json
):
最后,我们可以将匹配器添加到测试中(TB使用RSpec,进行相应调整):
访问现场了解完整的技术定义,
但是在thoughtbot网站和谷歌之间,
您应该能够找到如何根据自己的需要定制它。
祝你好运 对于如何做到这一点有一个很好的答案:
首先,将json模式
gem添加到gem文件中:
# 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\u errors.json
):
最后,我们可以将匹配器添加到测试中(TB使用RSpec,进行相应调整):
访问现场了解完整的技术定义,
但是在thoughtbot网站和谷歌之间,
您应该能够找到如何根据自己的需要定制它。
祝你好运 是的,我想对AJAX进行一个单独的测试,但是我会对同一个东西进行两个测试,这看起来不是很优雅。@BSeven,我真的不认为这里会有任何不雅观的地方。毕竟,你应该有单元测试,但你也应该有集成测试。您的集成测试通常会检查与单元测试相同的内容,不是吗?是的,我曾想过对AJAX进行单独的测试,但之后我会对相同的内容进行两次测试,这似乎不是很优雅。@BSeven,我真的认为这里不会有任何不雅观的地方。毕竟,你应该有单元测试,但你也应该有集成测试。您的集成测试通常检查与单元测试相同的内容,不是吗?问题似乎不在于JSON,而在于Capybara。我认为他们使用的是框架测试,问题似乎不是JSON,而是水豚。我认为他们正在使用机架测试。