运行测试时,我在save()方法中遇到错误。
var User = require('../../models/user')
, should = require('should');
describe('User', function(){
describe('#save()', function(){
it('should save without error', function(done){
var user = new User({
username : 'User1'
, email : 'user1@example.com'
, password : 'foo'
});
user.save(function(err, user){
if (err) throw err;
it('should have a username', function(done){
user.should.have.property('username', 'User1');
done();
});
});
})
})
})
这是错误:
$ mocha test/unit/user.js
․
✖ 1 of 1 test failed:
1) User #save() should save without error:
Error: timeout of 2000ms exceeded
at Object.<anonymous> (/usr/local/lib/node_modules/mocha/lib/runnable.js:1
61:14)
at Timer.list.ontimeout (timers.js:101:19)
答案 0 :(得分:7)
您可以嵌套描述,但不能测试。每个测试都是独立的,因此当您查看结果时,您可以看到它失败的位置 - 保存或没有用户名属性。例如,在上面的代码中,由于没有done(),因此无法使'should save without error'测试失败。这也是上面的代码超时的原因:mocha找不到'应该保存而没有错误'测试的done()。
能够嵌套描述是非常强大的。在每个描述中,您可以拥有before,beforeEach,after和afterEach语句。通过这些,您可以实现上面尝试的嵌套。如果您想阅读这些语句,请参阅mocha文档以获取更多信息。
我写下你想要达到的目的的方式如下:
var User = require('../../models/user')
, should = require('should')
// this allows you to access fakeUser from each test
, fakeUser;
describe('User', function(){
beforeEach(function(done){
fakeUser = {
username : 'User1'
, email : 'user1@example.com'
, password : 'foo'
}
// this cleans out your database before each test
User.remove(done);
});
describe('#save()', function(){
var user;
// you can use beforeEach in each nested describe
beforeEach(function(done){
user = new User(fakeUser);
done();
}
// you are testing for errors when checking for properties
// no need for explicit save test
it('should have username property', function(done){
user.save(function(err, user){
// dont do this: if (err) throw err; - use a test
should.not.exist(err);
user.should.have.property('username', 'User1');
done();
});
});
// now try a negative test
it('should not save if username is not present', function(done){
user.username = '';
user.save(function(err, user){
should.exist(err);
should.not.exist(user.username);
done();
});
});
});
});