Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何检查来自Rails的Capybara AJAX响应?_Ruby On Rails_Ruby_Rspec_Capybara - Fatal编程技术网

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,而是水豚。我认为他们正在使用机架测试。