2014-04-05 95 views
0

我想單元測試護照登錄用戶英寸在護照調用之前,我想插入一個用戶使用貓鼬模型。如果我在測試中直接與Mongoose連接,我可以插入測試用戶。但是,我似乎無法使用Kraken在之前創建的應用程序連接...單元測試與KrakenJS貓鼬模型

保存的調用只是掛起。

login.js測試:

'use strict'; 
var app = require('../index'), 
    kraken = require('kraken-js'), 
    nconf = require('nconf'), 
    request = require('supertest'), 
    mongoose = require('mongoose'), 
    should = require('chai').should(), 
    User = mongoose.model('User'), 
    request = require('supertest'), 
    agent, 
    env = process.env.NODE_ENV || 'testing'; 


nconf.use('file', { 
    file: process.cwd() + '/config/app.json', 
    format: nconf.formats.json 
}); 
var dbConf = nconf.get('databaseConfig')[env]; 

//mongoose 
/*if (mongoose.connection.db) { 
    return 
} else { 
    mongoose.connect("mongodb://" + dbConf.host + '/' + dbConf.database); 
    db = mongoose.connection; 
}*/ 

describe('login', function() { 

    var mock; 

    beforeEach(function (done) { 
     kraken.create(app).listen(function (err, server) { 
      mock = server; 
      agent = request.agent(app); 
      done(err); 
     }); 
    }); 


    afterEach(function (done) { 
     mock.close(done); 
    }); 

    describe('User', function() { 
     console.log('user time'); 
     before(function (done) { 
      var user = new User({ 
       email: "[email protected]", 
       firstName: "first", 
       lastName: "last", 
       password: "pass11", 
       userName: 'someone' 
      }); 
      user.save(function (err, user) { 
       console.log('user: ' + user); 
       console.log('err: ' + err); 
       done(); 
      }) 
     }); 
     describe('Login test', function() { 
      it('should redirect to /home', function (done) { 
       agent 
        .post('/users/session') 
        .field('userName', 'someone') 
        .field('password', 'pass11') 
        .expect('Location', '/home') 
        .end(done) 
      }) 

      after(function (done) { 
       //User.remove().exec(); 
       return done(); 
      }); 

     }) 
    }) 


}); 

回答

0

我不是很熟悉,貓鼬,但我在這裏思考的問題是,事情並沒有你認爲他們正在發生的順序發生。下面是具有相同的結構作爲測試的骨架:

describe('login', function() { 
    beforeEach(function() { 
     console.log("beforeEach"); 
    }); 
    afterEach(function() { 
     console.log("afterEach"); 
    }); 
    describe('User', function() { 
     before(function() { 
      console.log("before"); 
     }); 
     describe('Login test', function() { 
      it('should redirect to /home', function() { 
       console.log("test"); 
      }); 
      after(function() { 
       console.log("after"); 
      }); 

     }) 
    }) 
}); 

如果在此代碼運行摩卡,你會得到這樣的輸出(時髦的間距和所有):

login 
    User 
before 
     Login test 
beforeEach 
test 
     ✓ should redirect to /home 
afterEach 
after 


    1 passing (5ms) 

注意如何在您的beforeEach之前調用before回調。因此,您的用戶已創建,並且在獲得連接之前完成對save的呼叫。在我看來,改變你的代碼,以便連接創建一次,並且只有一次在所有測試之前關閉,並且在測試之後關閉一次纔是方法。如果你想這樣做,你需要將你的beforeEach改成beforeafterEach改成after