Чистый сбор Mocha MongoDB перед каждым тестом - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь очистить 2 коллекции перед каждым тестом.Я использую mocha --watch для повторного запуска тестов при редактировании исходных файлов тестов.Первый запуск всегда выполняется должным образом, но при последовательных запусках выдается ошибка Topology was destroyed от mongodb (указывается в результате запроса http).

Я не совсем уверен, почему deleteMany удаляет мой вставленный объект в последовательных запусках.

describe('myCollection1 related tests', () => {
    // myCollection1 documents should refer to a valid myCollection2 document.
    var foo;
    const exampleObject = {name: 'TEST OBJECT', attr1: 'TO'};
    beforeEach(() => {
        return Promise.all([
            mongo.db('mydb').collection('myCollection1').deleteMany({}), // clear collection 1
            mongo.db('mydb').collection('myCollection2').deleteMany({}) // clear collection 2
            .then(() => mongo.db('mydb').collection('myCollection2').insertOne(exampleObject) // and add a sample object
            .then((value) => {
                foo = value.ops[0]; // save this as test specific variable so I can use it in my tests.
                return Promise.resolve();
            })),
        ]);
    });

    it('should create a related object', (done) => {
        chai.request(server)
            .post('/api/v1/foos/')
            .send({ related: foo._id })
            .then((res) => {
                res.should.have.status(200);
                res.body.should.be.an('object').with.all.keys('status', 'errors', 'data');
                done();
            }).catch((err) => {
                done(err);
        });
    });
});

1 Ответ

0 голосов
/ 28 ноября 2018

Я обнаружил проблему с вашей структурой обещаний в beforeEach.Я не уверен, предназначено ли это или нет.Боюсь, это виновник.Я исправляю это ниже:

  beforeEach(() => {
    return Promise.all([
        mongo.db('mydb').collection('myCollection1').deleteMany({}),
        mongo.db('mydb').collection('myCollection2').deleteMany({})
      ]) // close the promise.all here
      .then(() => collections.engines().insertOne(exampleObject)) // close `then` here
      .then((value) => {
        foo = value.ops[0];
        return Promise.resolve();
      });
  });

Надеюсь, это поможет

...