【问题标题】:Unit testing Mongoose models with KrakenJS使用 KrakenJS 对 Mongoose 模型进行单元测试
【发布时间】:2014-05-17 23:06:44
【问题描述】:

我正在尝试对通行证进行单元测试以登录用户。在通行证调用之前,我想使用 Mongoose 模型插入一个用户。如果我在测试中直接与 Mongoose 连接,我可以插入测试用户。但是,我似乎无法使用 Kraken 在 beforeEach 中创建的应用程序连接...

保存调用刚刚挂起。

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: "user@user.com",
                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();
            });

        })
    })


});

【问题讨论】:

    标签: mongoose mocha.js kraken.js


    【解决方案1】:

    我对猫鼬不是很熟悉,但我认为这里的问题是事情并没有按照你认为的顺序发生。这是一个与您的测试具有相同结构的骨架:

    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");
                });
    
            })
        })
    });
    

    如果你在这段代码上运行 Mocha,你会得到这个输出(时髦的间距和所有):

      login
        User
    before
          Login test
    beforeEach
    test
            ✓ should redirect to /home 
    afterEach
    after
    
    
      1 passing (5ms)
    

    注意before 回调是如何在beforeEach 之前调用的。因此,您的用户已创建,并且对 save 的调用已完成,在您获得连接之前。在我看来,更改您的代码以便连接创建一次,并且在所有测试之前只创建一次,并且在您的测试之后只关闭一次将是可行的方法。如果您想这样做,您需要将您的 beforeEach 更改为 beforeafterEach 更改为 after

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 2016-05-30
      • 2018-12-14
      • 2019-01-09
      • 1970-01-01
      相关资源
      最近更新 更多