0

当我尝试遵循 TDD 开发方式时,我仍然很难找出如何在 JavaScript 中模拟某些东西。我习惯于在 Java 中使用 Mockito 和 Spring 进行模拟(例如,注入一个 mongo 模拟而不是真正的 mongo 实例),但是如何在 JavaScript 中处理这个?

让我用 node-restify 做一个简单的 node.js 示例:

var mongoskin = require('mongoskin');
var restify = require('restify');

// ###############################
// ## Global Configuration
// ###############################

var mongoURL = process.env.MONGOHQ_URL || "mongodb://localhost/test";
var serverPort = process.env.PORT || 5000;

// ###############################
// ## Basic Setup
// ###############################
var server = restify.createServer({
    name: 'test'
});

server.use(connect.logger());
server.use(restify.acceptParser(server.acceptable));
server.use(restify.bodyParser());

var db = mongoskin.db(mongoURL);

// ###############################
// ## API
// ###############################

server.get('/api/v1/projects', function (req, res, next) {
    db.collection('projects').find().toArray(function (error, projects) {
        if (error) {
            return next(new restify.InternalError());
        }

        res.json(200, projects);

        return next();
    });
});

server.get('/api/v1/projects/:projectId', function (req, res, next) {
    if (req.params.projectId === null) {
        return next(new restify.InvalidArgumentError('ProjectId must not be null or empty.'))
    }

    db.collection('projects').findById(req.params.projectId, function (error, project) {
        if (error) {
            return next(new restify.InternalError());
        }

        res.json(200, project);

        return next();
    });
});

// ###############################
// ## Main Server Initialization
// ###############################

server.listen(serverPort, function () {
    console.log('%s listening at %s', server.name, server.url);
});

我现在想要一个测试 javascript 文件,我可以在其中测试这两个“get”方法。此外,我想模拟 mongoskin 实例('db'),以便我可以使用例如 JSMockito 来监视和假装某些行为。

现在最好的方法是什么?有人可以发布一个小示例文件吗?我如何设法注入模拟的数据库实例?

谢谢你的帮助!

蒂埃里

4

1 回答 1

0

一般来说,有很多优先级可以轻松模拟休息 api: https ://github.com/flatiron/nock

模拟数据库的问题在于它通常有一个非常复杂和毛茸茸的 api。有两种简单的(因此在严格的单元测试意义上不太正确)方法可以做到这一点。

一种是拥有“模型”来包装您的实体访问,而不是直接访问数据库驱动程序。然后您可以轻松地模拟您的模型 api。这很好,但是如果你只是做一些基本的数据库操作并且你不需要一个大的模型抽象,那就有点烦人了。

第二个是用一些测试数据启动一个数据库,并在测试期间连接到它。这有点像“功能测试”,但根据我的经验,它更实用。

于 2012-10-08T15:26:44.057 回答