从Node的mocha测试中访问Mongo

时间:2015-04-06 20:14:39

标签: node.js mongodb mocha

我有一个节点文件用于一些简单的数据访问,它似乎适用于我的手动测试。那段代码在这里:

(function() {

var mongojs = require("mongojs");
var uuid = require("node-uuid");

var db = mongojs("tradeAssistant", ["tickers"]);

function insertTicker(tickerSymbol) {
    if (tickerSymbol) {
        var ticker = db.tickers.findOne({
            symbol: tickerSymbol
        });

        if (!ticker) {
            console.log("inserting " + tickerSymbol);

            db.tickers.insert({
                _id: uuid.v4(),
                symbol: tickerSymbol,
                isNew: true
            }, function(err, data) {
                console.log("back from db.tickers.insert");
            });
        }
    }
}

exports.addTickers = function addTickers(tickers, callback) {
    if (tickers) {
        for (var i = 0; i < tickers.length; i++) {
            insertTicker(tickers[i].toUpperCase());
        }
    }
    callback(null, null);
};

exports.fetchTickers = function fetchTickers(query, callback) {
    var results = [];
    if (!query) {
        query = {}
    };

    db.tickers.find(query, function(err, docs) {
        if (!err) {
            for (var i = 0; i < docs.length; i++) {
                results.push(docs[i]);
            }
        }
        callback(err, results);
    });
}
})();

正如我所说,该代码似乎有效。我试图建立一些mocha集成测试,但他们没有工作。当我开始深入研究和调试时,我发现mongo在Mocha中根本不起作用。不确定我错过了什么。

(function() {
var mongojs = require("mongojs");
var should = require("should");
var db = mongojs("tradeAssistant", ["tickers"]);

//var tickerData = require("../../mongoDataAccess/tickersAccess");

describe("tickerAccess.addTickers()", function() {
    it("test 1", function() {

        db.tickers.insert({
            symbol: "DIA",
            isNew: true
        }, function(err, data) {
            console.log("hello world");
        });
    });
});
})();

我是Node的新手,所以如果你看到其他需要&#34;修复的东西,&#34;请不要害羞。但更重要的是,我很感激任何人都可以提供的帮助,说明为什么mongo似乎不适用于摩卡。我没有错; mongo日志文件中没有任何内容,我的console.log()永远不会被调用。

提前感谢您的帮助。

维克

2 个答案:

答案 0 :(得分:1)

您需要设置it处理程序以获取done参数,并在mongo操作的回调中调用done(),让mocha知道异步操作已完成:

describe("tickerAccess.addTickers()", function() {
    it("test 1", function(done) {

        db.tickers.insert({
            symbol: "DIA",
            isNew: true
        }, function(err, data) {
            console.log("hello world");
            done();
        });
    });
});

有关如何在mocha here中运行异步代码的更多信息。

答案 1 :(得分:0)

您忽略了测试的异步性质。您可以像这样在测试中添加回调:

describe("tickerAccess.addTickers()", function() {
  it("test 1", function(done) {
    db.tickers.insert({
        symbol: "DIA",
        isNew: true
    }, function(err, data) {
        console.log("hello world");
        done()
    });
  });
});