如何在mocha测试中顺序运行两个函数

时间:2017-11-07 10:42:48

标签: node.js mocha chai

我的mocha-chai测试中有两个describe块,一个用于测试POST API,另一个用于GET API。有一个依赖,比如GET API的函数首先调用POST API的函数。

但是,当我一个接一个地调用这两个函数时,它们都会同时启动,从而失败。

代码如下所示:

 var server;
 var mongodb;

  before(function (done) {
    server = require('../../../app.js'); // same as "node app.js"
    done();
  })

  after(function (done) {
    server.close();
  })

function this_is_post_call() {
    describe('POST call', ()=> {
        it('Creating project', (done) => {
            chai.request(server)
            .post('/create/myproject')
            .send()
            .end((err, res) => {
             expect(res.statusCode).to.equal(200);

          done();
        });
    });

});
}

function this_is_get_call() {
    this_is_post_call();
    describe('GET call', ()=> {
        it('Reading project', (done) => {
            chai.request(server)
            .get('/read/myproject')
            .send()
            .end((err, res) => {
            expect(res.statusCode).to.equal(200);

         done();
        });
    });

}

this_is_post_call();
this_is_get_call();

基本上当我运行它时,独立的this_is_post_call()和this_is_get_call()中的那个被同时调用,并且它在尝试创建两次相同的项目时失败。

顺序调用它们的有效方法是什么,以便它们不会在上一个完成之前启动。

感谢。

1 个答案:

答案 0 :(得分:0)

这样的事情可能有用(不完全确定chai.request部分)

var server;
var mongodb;

describe('server', () => {
  before(function (done) {
    server = require('../../../app.js'); // same as "node app.js"
    done();
  })

  after(function (done) {
    server.close();
  })

  beforeEach(() => {
    // find a way to clear the database
    // using mongodb variable maybe
  })

  describe('when you make a post', () => {
    var postResult
    beforeEach((done) => {
      chai.request(server)
          .post('/create/myproject')
          .send()
          .end((err, res) => {
            var postResult = res
            done();
          });
    })


  })

  it('should respond with OK', () => {
    expect(postResult.statusCode).to.equal(200);
  })

  it('should let you make make a get', () => {
    chai.request(server)
        .get('/read/myproject')
        .end((err, res) => {
          expect(err).to.be.null;
          expect(res.statusCode).to.equal(200);
          done();
        });
  })
})
如果你没有办法清理数据库,

这样的事情也可能有用

var server;
var mongodb;

describe('server', () => {
  before(function (done) {
    server = require('../../../app.js'); // same as "node app.js"
    done();
  })

  after(function (done) {
    server.close();
  })

  it('should let you post and then get', () => {
    var postResult
    beforeEach((done) => {
      chai.request(server)
          .post('/create/myproject')
          .send()
          .end((err, res) => {
            expect(postResult.statusCode).to.equal(200);
            chai.request(server) // not sure if this is the correct chai.request format
                .get('/read/myproject')
                .end((err, res) => {
                  expect(err).to.be.null;
                  expect(res.statusCode).to.equal(200);
                  done();
                });
          });
    })
  })
})