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

时间:2018-03-20 14:43:32

标签: typescript asynchronous mocha supertest

我有一个测试,通过对API的POST调用创建一个新的“市政”记录...然后在同一个测试中,我想要回来查看它是否已成功创建。问题是,我认为它恢复得太快(在成功创建记录之前)。我该如何解决这个问题?我不希望在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);

1 个答案:

答案 0 :(得分:0)

我使用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);
    });