将MongoDb结果存储在变量中以运行Mocha测试,获取未定义

时间:2016-11-04 15:19:14

标签: node.js mongodb mocha

所以,我正在尝试运行Mocha测试,更准确地说是Chakram测试。 问题是,我从MongoDB中的集合中获取数据,我想将这些数据存储在全局变量中以运行一些测试。 问题是在回调中我得到了数据,但它没有设置全局变量来运行测试。

这是代码

var chakram = require('chakram'),
    expect = chakram.expect;

describe("Test", function() {
    var gl_email;
    var gl_token;

    before("Getting user data", function() {

        var setAccessData = function() {
            var MongoClient = require('mongodb').MongoClient;

            MongoClient.connect('mongodb://localhost/virtusapp', function(err, db) {
                if (err) throw err;
                console.log("Connected to Database");
                var user = db.collection('users').findOne({
                    name: "virtus-app"
                });
                user.then(function(result) {
                    email = result.email;
                    token = result.token1 + result.token2;
                    db.close(test(email, token))
                });
            });
        }

        var test = function(email, token) {
            gl_email = email;
            gl_token = token;

            //Here the email and token are set, but it doesnt set the global variables

        }

        setAccessData();
    });

    it("should have set global email variable", function() {

        //here gl_email should be set, but I get UNDEFINED.

        expect(gl_email).to.eql("virtus-app@virtus.ufcg.edu.br");
    })
});

我认为问题不在于Chakram,因为我还没有在这段代码中使用过。

1 个答案:

答案 0 :(得分:1)

您的before函数是异步的。您应该使用不同的签名来告诉mocha它必须等到它完成才能运行测试。

before("Getting user data", function(done) {
...

    var test = function(email, token) {
        gl_email = email;
        gl_token = token;

        done();

    }
...
});

只有在调用done()之后,其余的代码才会被mocha执行。

Mocha docs提供了有关如何测试异步代码https://mochajs.org/#asynchronous-code

的非常全面的指南