我正在使用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.locationList
和result
对象,但测试超时。我有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()
。
答案 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试图枚举它们以进行深度比较时,其中一个以某种方式卡在无限循环中。