如何 运行 mocha 同步测试,POST 和 GET 请求

How to run mocha tests synchronously, for POST and GET request

我为 couchbase 数据库构建了一个 API,目前我正在使用 mocha 为我的 HTTP 请求编写测试。我 运行 遇到的问题是我的 GET 请求测试无法找到通过 POST 请求测试添加的数据。如果在测试 运行 之前数据库中有数据存储在其中,GET 请求测试将通过。但是它 returns 的数据不包括来自 POST 请求测试的新添加数据。我需要能够 运行 在干净的数据库上进行测试并通过所有测试。我相信这个问题是由于 mocha 的异步性质引起的,但我不确定如何解决这个问题。这是我的测试用例。

依赖关系

const expect = require('chai').expect;
const request = require('supertest');
const app = require('../src/app');

POST 请求测试

describe(`POST requests`, ()=>{
  it('Add new data', function() {
    return request(app)
      .post('/someendpoint')
      .set('Accept', 'application/json')
      .set('Authorization', auth_token)
      .send(newData)
      .expect(200)
      .then( function(res) {
        expect(res.body).be.a('Object');
        expect(res.body.id).be.a('string');
        id = res.body.id;
      })
    });
  });

GET请求测试

describe('GET requests', function() {
  it('Get data', function() {
    return request(app)
      .get('/someendpoint')
      .set('Accept', 'application/json')
      .set('Authorization', auth_token)
      .expect(200)
      .then((res) => {
        expect(res.body).be.a('Array');
      })
    });
  });

此外,如果它有所作为。每次发出 POST 请求时,都会在 couchbase 数据库中创建一个新文档

这是我找到的一个糟糕的解决方案(编辑)

    before('timer for get data', function(){
        for(let i = 0; i < 1000000000; i++){
        }
    })
    
    it('get data', function() {
        return request(app)
        .get('/someendpoint')
        .set('Accept', 'application/json')
        .set('Authorization', auth_token)
        .expect(200)
        .then((res) => {
            expect(res.body).be.a('Array');
        });
    });

我认为你需要全力以赴 'POST' 测试。

我用这个方法测试 post API:

//Pseudocode
request(app)
  .post()
  .expect().then({
    //do assertions
    request(app)
      .get()
      .expect().then({
        //do assertions
      })
  })

我知道您必须将每个测试都分成它的套件,但这不是 'GET test' 到 'POST suite'。这是一个 POST 测试,您可以在其中使用 GET API 断言数据已插入。所以完全是 'POST test'.

所以,代码将是这样的(我喜欢使用 done()):

it('should post', (done) => {
    request(app)
        .post('/endpoint')
        .expect(200).then(postResponse => {
            //assertion
            request(app)
                .get('/endpoint')
                .expect(200).then(getResponse => {
                    //assertion
                    done()
                }).catch(e => {
                    done(e)
                })
        }).catch(e => {
            done(e)
        })
})