美文网首页
后端单元测试

后端单元测试

作者: sweetBoy_9126 | 来源:发表于2022-04-29 20:37 被阅读0次

    如何测试 api

    1. 使用 curl 命令

    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
    

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

    相关文章

      网友评论

          本文标题:后端单元测试

          本文链接:https://www.haomeiwen.com/subject/himsyrtx.html