Mocha / Chai测试悬挂在.should.be.deep.equal,尽管结果存在

时间:2015-12-01 22:43:37

标签: node.js unit-testing mongoose mocha chai

我正在使用Mocha和chai运行一些测试。其中一项测试是挂在.should.be.deep.equal电话上。

这是测试代码:

// Make the fake connection before running tests
before(function(done) {
    mongoose.connect('mongodb://fake.test/TestingDB', function(err) {
        done(err);
    }); 
});

// Test Cases
describe('Testing the functions that deal with users and locations:', function() {
    // Test Setup
    var req = {};
    beforeEach(function(done) {
        mockgoose.reset()
        async.parallel([function(callback){
            sensors.create(testData.deviceData, function(err, model) {
                    if (err) {console.log(err)}
                    callback();
                });
        }, function(callback) {
            locations.create(testData.locationData, function(err, model) {
                    if (err) {console.log(err)}
                    callback();
                });
            }], function(err) {
                done();
            });
    });

    afterEach(function(done) {
        mockgoose.reset();
        done();
    });
    // Tests
    describe('function locationList', function() {
        it('should list the test location', function(done) {
            dbFunctions.locationList(req, function(result) {
                console.log(result) //Prints the whole result
                console.log(testData.locationList)
                result.should.exist; //This doesn't cause it to hang
                result.should.be.deep.equal(testData.locationList) //hangs here
                done(result);
            });
        })
    })
});

以下是它正在测试的功能:

exports.locationList = function(req, callback) {
listLocations().then(
    function(data) {
        callback(data);
    },
    function(err) {
        console.log('Error Retrieving Location Information: ' + err);
        callback(err);
    });
};

正如我在评论中指出的那样,结果对象存在并被打印到控制台。 results.should.exist;不会抛出异常,如果我注释掉除了它之外的所有内容,那么测试工作正常。出于一些奇怪的原因,尽管存在testData.locationListresult对象,但测试超时。我有14个其他测试使用完全相同的语法没有任何问题。有谁知道这个特定测试会导致这种情况发生的原因?

这是测试的输出:

Testing the functions that deal with users and locations:
    function locationList                            
        [ { devices: {},
            address: '123 Fake St, Waterloo, On',
            location: 'Unittest',
            owner: 'unit@test.com',
            _id: '-1' } ]         
        [ { devices: {},
            address: '123 Fake St, Waterloo, On',
            location: 'Unittest',
            owner: 'unit@test.com',
            _id: '-1' } ]          

            1) should list the test location
0 passing (2s)
1 failing
1) Testing the functions that deal with users and locations: function locationList should list the test location:
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
    at null.<anonymous> (C:\Users\My Name\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:189:19)   

延长超时并不起作用。也不会随机放置一些东西(即1函数中的整数.should.be.deep.equal()

2 个答案:

答案 0 :(得分:2)

我的猜测是exports.locationList中的回调是同步调用的,并且你的测试用例实际上是失败的,抛出一个异常,它永远不会被捕获,因为回调是(同步地)从一个promise处理程序中调用的(更多信息here)。

尝试看看这是否更有效:

dbFunctions.locationList(req, function(result) {
  setImmediate(function() {
    console.log(result) //Prints the whole result
    console.log(testData.locationList)
    result.should.exist; //This doesn't cause it to hang
    result.should.be.deep.equal(testData.locationList) //hangs here
    done(result);
  });
});
// or use a module like dezalgo (https://github.com/npm/dezalgo)

根本原因可能是mockgoose

此外,您没有使用正确的Node.js约定,其中回调函数的第一个参数是“保留”的错误。换句话说,您的代码应该类似于:

if (err) {
  callback(err);
} else {
  callback(null, data);
}

您现在将错误数据作为第一个参数传递。

答案 1 :(得分:1)

一个猜测:也许问题在于猫鼬用它自己的函数/成员装饰result,当chai试图枚举它们以进行深度比较时,其中一个以某种方式卡在无限循环中。