Supertest - 如何使用 POST 创建新记录,然后将其取回 GET - 异步系列

Supertest - how to create new record with POST, then get it back GET - async series

我有一个测试创建了一个新的 "municipality" 记录,并通过 POST 调用 API... 然后在同一个测试中,我想取回它并查看是否创建成功。问题是,我认为它恢复得太快了(在成功创建记录之前)。我该如何解决?在 POST 完成之前,我不想调用 "GET"。

我的测试是这样的:

    it('Insert random muncipality with name of APIAutomation-CurrentDateTime', function (done) {
    let newMuncID = 0;
    //create a random string first for the name.
    var currentDateTime = new Date().toLocaleString();
    api.post('/rs/municipalities')
      .set('Content-Type', 'application/json')
      .send({
        "muncplName": "APIAutomation-" + currentDateTime,
        "effDate": "2018-01-25",
        "provId": 8
      })
      .end(function (err, res) {    
        expect(res).to.have.property('status', 200);
        expect(res.body).to.have.property('provId', 8);
        newMuncID = res.body.muncplId;
        done();
      });

      //Now, query it back out again
      api.get('/rs/municipalities/' + newMuncID)
      .set('Content-Type', 'application/json')
      .end(function (err, res) {    
        expect(res.body).to.have.property("provId", 8);
        done();
      });
  });

初始化此代码如下所示:

import {expect} from 'chai';
import 'mocha';
import {environment} from "../envConfig"

var supertest = require("supertest");
var tags = require('mocha-tags');
var api = supertest(environment.URL);

我使用 Async package 找到了一个很好的解决方案。它允许您连续进行 API 次调用。您可以让它等待答案返回后再执行下一个测试。

代码最终看起来像这样:

it('Change a municipality name', function (done) {   
        async.series([

            function(cb) { //First API call is to get the municipality 
                api.get('/rs/municipalities/' + muncToBeAltered)
                .set('Content-Type', 'application/json')
                .end(function (err, res) {   
                    actualVersion = res.body.version;
                    cb();
                }); 
            }, //end first - GET API call

            function(cb) { //second API call is to make a change
                api.put('/rs/municipalities/' + muncToBeAltered)
                .set('Content-Type', 'application/json')
                .send({
                    "muncplName": newMuncName,
                    "provId": "3",
                    "status": "01",
                    "version": actualVersion
                })
                .end(function (err, res) {    
                expect(res).to.have.property('status', 200); 
                cb();
                });
            }, //end second - PUT API call

        ], done);
    });