如何测试 api
1. 使用 curl 命令
- 发送 GET 请求
curl http://localhost:3000/api/v1/tags?page=1 -v(加-v可以看响应) - 发送 POST 请求
curl -X POST http://localhost:3000/api/v1/tags
添加请求头 -H 'Content-Type: application/json'
添加消息体 -d '{"amount":99}' - 发送其他请求
curl -X PATCH ...
1.1. curl 的弊端
1). 难写
2). 难批量
3). 难重复操作
2. 使用 RSpec
2.1. 单元测试要测什么
- 目前我们只测 controllers
因为我们的 Model 和 View 都很简单 - 不测这些
不测 Rails 自带的功能,因为 Rails 测过了
不测第三方功能,因为他们应该自己测,我们直接 mock 掉
2.2. 如何测试
具体流程
1). 在 Gemfile 里的 group :development, :test do 下面添加
group :development, :test do
+ gem 'rspec-rails', '~> 5.0.0'
end
2). 运行 bundle
3). 安装 rspec
rails generate rspec:install
4). 针对我们创建的 mode 进行测试
rails generate rspec:model user
运行上面命令会创建一个 spec/models/user_spec.rb
# 公用的工具类方法,比如登录
require 'rails_helper'
RSpec.describe User, type: :model do
# 期待user.email 去等于 lifa.com
it '有 email' do
user = User.new email: 'lifa.com'
expect(user.email).to be 'lifa.com'
end
end
5). 运行测试用例
bundle exec rspec
然后会发现报错没有找到我们的用例,原因是我们的测试数据库没有配置
解决方法:
i. 在 databse.yml 里的test里将我们的 dev 的username、password和host拷贝过去
test:
<<: *default
database: mangosteen_1_test
username: mangosteen
password: 123456
host: db-for-mangosteen
ii. 然后运行
RAILS_ENV=test bin/rails db:create
创建测试数据库
iii. 创建我们dev环境下创建db/migrate的数据表
RAILS_ENV=test bin/rails db:migrate
再次运行 bundle exec rspec
将我们的代码里的 to be 换成 to eq 就可以了
RSpec.describe User, type: :model do
it '有 email' do
user = User.new email: 'lifa.com'
expect(user.email).to eq 'lifa.com'
end
end
2.3 如何测试 controller
- 使用 RSpec 的 request test 功能
2.3.1 测试 Items
1). 创建 对应的测试文件
bin/rails generate rspec:request items
2). 创建完后生成 items_spec.rb
RSpec.describe "Items", type: :request do
describe "index by page" do
it "works! (now write some real specs)" do
# 创建11个amount为100 的Item
11.times { Item.create amount: 100 }
expect(Item.count).to eq 11
# 请求方式 接口地址
get '/api/v1/items'
# 期待响应的http状态码有 200
expect(response).to have_http_status 200
json = JSON.parse(response.body)
# 期待resources的size是10
expect(json['resources'].size).to eq 10
# 请求第二页
get '/api/v1/items?page=2'
expect(response).to have_http_status 200
json = JSON.parse(response.body)
# 期待第二页的size是1
expect(json['resources'].size).to eq 1
end
end
describe "create" do
it "can create an item" do
# 期待调用 post接口的每次Item.count 加1
expect {
post '/api/v1/items', params: {amount: 99}
}.to change {Item.count}.by 1
expect(response).to have_http_status 200
json = JSON.parse response.body
# 期待 id 是数字
expect(json['resource']['id']).to be_an(Numeric)
end
end
end
2.3.2. 测试 ValidationCode
- validation_codes_controller
class Api::V1::ValidationCodesController < ApplicationController
def create
# 产生随机六位数
code = SecureRandom.random_number.to_s[2..7]
validation_code = ValidationCode.new email: params[:email],
kind: 'sing_in', code: code
if validation_code.save
head 200
else
render json: {errors: validation_code.errors}
end
end
end
- validation_codes_spec
RSpec.describe "ValidationCodes", type: :request do
describe "验证码" do
it "可以被发送" do
post '/api/v1/validation_codes', params: {email: 'wanglifa1995@gmail.com'}
expect(response).to have_http_status(200)
end
end
end
网友评论