测试应用与非人类用户的交互,涵盖外部 API
7.1request test vs feature test
对 RSpec 来说,这种专门针 对 API 的测试最好放在 spec/requests 目录中,与前面编写的功能测试分开。
这种测试也不使用 Capy- bara,因为它模拟的是浏览器交互,而不是程序交互。
我们要使用的是前面测试控制器响应的 HTTP 动 词:get、post、delete 和 patch。
end-point:端点。
7.2测试GET请求
向API请求数据。
请求测试与控制器测试不通的地方在于,可以使用应用的任何路由。
bin/rails g rspec:request projects_api
create spec/requests/projects_apis_spec.rb
#调试:看看response.body是什么。一个array,包含了登陆用户的projects的信息.
[{"id":2,"name":"Second Sample Project","description":"A test project.","due_on":"2018-05-26","created_at":"2018-05-19T07:30:14.169Z","updated_at":"2018-05-19T07:30:14.169Z","user_id":1}]
#调试:转化为json ,: 变为 =>
[{"id"=>2, "name"=>"Second Sample Project", "description"=>"A test project.", "due_on"=>"2018-05-26", "created_at"=>"2018-05-19T07:30:14.169Z", "updated_at"=>"2018-05-19T07:30:14.169Z", "user_id"=>1}]
#最后,解析第二次请求返回的JSON数据。看看是否match.
一般从web上response的数据格式是string,这个数据又是用JSON模式写的,则可以使用parse().
Parsse the data with JSON.parse(), and the adta becomes a JavaScript object.
7.3 测试POST 请求
向API发送POST请求。
{:name=>"Project 1", :description=>"A test project.", :due_on=>Sat, 26 May 2018 08:22:01 UTC +00:00}
#向API发送POST请求。需要传递身份验证,项目相关属性。
# response.body: {"status":"created"}
# response.header:
7.4 把控制器测试替换为请求测试
要点:把控制器测试中的HTTP VERB 后的:create等方法改为相对路径
post :create改为post projects_path
另外:
与 API 的控制器不同,这些控制器动作使用标准的电子邮件和密码验证身份
2.然后,在spec/rails_helper.rb文件中让Devise把辅助方法应用到请求测试中。
RSpec.configure do |config|
...
config.include Devise::Test::ControllerHelpers, type: :controller
config.include RequestSpecHelper, type: :request
end
7.5 小结
redirect_to 可以用在请求测试,
have_http_status 可以用在feature,request 人, controller测试。
具体见https://www.rubydoc.info/gems/rspec-rails/frames#redirect_to