Mocha/Chai Tests using Mongoose Occasionally Fail on First Run

情到浓时终转凉″ 提交于 2020-01-06 20:21:19

问题


I have a series of Mocha/Chai tests that are set up as follows:

var mongoTest = require('../mongoTest.js');

//Connect to test DB before tests and disconnect after
before(function(done) {
    mongoTest.mongoConnect(done);
});

after(function(done) {
    mongoose.disconnect(done);
})

//Load Data Files
var testData = require('../testData.js')
var deviceAndLocationAnswers = testData.deviceAndLocationAnswers

//Repeated Functions:
var clearCollections = function(coll, callback) {
    mongoose.connection.db.dropCollection(coll.collectionName, 
        function(err, result) {
            callback();
        });
}

describe('Testing functions that use the Breakers collections', function(){
    //Test Setup
    var req = {query: {device: testData.powerConsumptionDevice}}

    before(function(done) {
        this.timeout(15000);
        async.forEach(mongoose.connection.collections, clearCollections, 
            function(err) {
                if (err) {console.log(err)};
                done();
            })
    });

    before(function(done) {
        this.timeout(15000);
        Breakers.create(testData.breakersData, function(err, model){
            done(err);
        });
    });

    after(function(done) {
        this.timeout(15000);
        async.forEach(mongoose.connection.collections, clearCollections, 
            function(err) {
                if (err) {console.log(err)};
                done();
            })
    });

    // Tests
    describe('Testing powerConsumption Function', function() {  
        it('Should produce some output', function(done) {
            this.timeout(15000);
            dbFunctions.powerConsumption(req, function(result) {
                result.should.exist;
                done();
            });
        });
        it('Should produce the same results as the mock up from testData', function(done) {
            this.timeout(15000);
            dbFunctions.powerConsumption(req, function(result) {
                result.should.be.deep.equal(testData.powerConsumptionResults);
                done();
            });
        });
    });
});

mongoTest comes from the following file I have:

var mongoose = require('mongoose')
var dBaseURL = 'mongodb://xxxx:yyyyy@ds#####.mongolab.com:zzzz/myDB'; // details removed
exports.mongoConnect = function(callback) {
    mongoose.connect(dBaseURL, function(err) {
        if(err) {
        console.log('MongoDB Connection Error', err);
        } else {
            console.log('MongoDB Connection Successful')
        }
        callback();
    });
};

I have a total of 14 tests, set up similarly to the ones I've used as examples. The first time I run these tests, a few will always fail (it's never the same few). If I run the tests again immediately after, all of them will pass.

Failure takes the form of the .should.be.deep.equal() calls failing with large diffs. I'm not sure how this could happen, as the data doesn't change between tests.

I've checked the database between tests and the collections are always deleted after the tests have run.

Does anyone have any ideas as to what could be going on here? I'm new to node.js, so it's very likely I've missed some bit of best practice that's causing all of this.

Also, I am aware that it is best practice to mock out the database. I already have a set of tests that do this. I also want a set of tests that use the database so that I can test the actual behavior.

ETA: Turns out my problems had nothing to do with the code I had posted here.

The functions that would occasionally fail the tests were those that had database calls that didn't sort the output in any particular way. It turns out that Mongoose would sometimes (but not always? WHY?) sort the query results in such a way that they would pass the test. I'd be interested to hear an explanation of how this is the case, but my question can be considered solved.

来源:https://stackoverflow.com/questions/34072735/mocha-chai-tests-using-mongoose-occasionally-fail-on-first-run

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!