2012-11-10 2 views
8

Я продолжаю получать ошибку в методе 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  : '[email protected]' 
     , 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

Как мы можем установить 'username' свойство из реальной функции, так что мы получаем имя пользователя недвижимость в' user.should.have. свойство ('username', 'User1'); '? Можем ли мы отправить как 'res.send ({имя пользователя: 'User1'})' или 'res.render ('home', {имя пользователя: 'User1'})' в реальной функции? –

ответ

7

Вы можете гнездо описывает, но не тестируется. Каждый тест должен быть автономным, поэтому, когда вы просматриваете свои результаты, вы можете увидеть, где он находится, - при сохранении или отсутствии свойства имени пользователя. Например, в приведенном выше коде нет способа, чтобы он не выполнял тест «должен сохранять без ошибок», поскольку нет done(). Которая также является причиной того, что код, приведенный выше, отключается: mocha не может найти done() для теста «should save without error».

Способность гнездования описать очень сильно. Внутри каждого описания вы можете иметь команду 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  : '[email protected]' 
     , 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(); 
     }); 
    }); 
    }); 
}); 
+0

Когда я запускаю этот тест я получаю: '\t \t он ('должен иметь имя пользователя свойство', функция (сделано) { \t \t ^^ SyntaxError: Неожиданное identifier' это не нравится "он (" ' – chovy

+0

фигу , я нашел ошибку. Спасибо, что это очень полезно. – chovy

+0

Если я добавлю другое описание как второй ребенок первого описания, User.rmeove() не имеет никакого эффекта. – chovy

Смежные вопросы