Rspec: everyday-rspec实操。第7章使用请求测试-测试API

测试应用与非人类用户的交互,涵盖外部API

7.1request test vs feature test

RSpec来说,这种专门针对API的测试最好放在spec/requests目录中,与前面编写的功能测试分开。

这种测试也不使用Capy-bara,因为它模拟的是浏览器交互,而不是程序交互。

我们要使用的是前面测试控制器响应的HTTP动词:getpostdeletepatch

end-point:端点。

7.2测试GET请求

请求测试与控制器测试不通的地方在于,它不限定于特定的控制器,可以使用应用的任何路由

bin/rails g rspec:request projects_api

create spec/requests/projects_apis_spec.rb

it "loads a project" do

user = FactoryGirl.create(:user)

FactoryGirl.create(:project, name:"Sample Project")

FactoryGirl.create(:project, name:"Second Sample Project", owner: user)

#发送HTTP GET请求,为了验证身份,API要求提供用户的电子邮件地址和验证令牌,因此我们将其放到参数中

get api_projects_path, params:{

user_email: user.email,

user_token: user.authentication_token

}

expect(response).to have_http_status(:success)

#调试:看看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}]

byebug

puts "---#{response.body}---"

json =JSON.parse(response.body)

puts "---#{json}---"

byebug

#调试:转化为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}]

expect(json.length).to eq 1

project_id = json[0]["id"]

puts "---#{project_id}---"

byebug

# 期望json的数据是一条,之后获取这个project的

相关推荐