后端单元测试

2022-04-29  本文已影响0人  sweetBoy_9126

如何测试 api

1. 使用 curl 命令

1.1. curl 的弊端

1). 难写
2). 难批量
3). 难重复操作

2. 使用 RSpec

2.1. 单元测试要测什么

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

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
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
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

想找 matcher 可以看 RSpec 文档
and 和 or 也是支持的,见文档

上一篇下一篇

猜你喜欢

热点阅读