node.js - 用另一个函数替换一个函数进行测试

标签 node.js testing mocha.js

我有一个名为 connectToMongo 的函数,它连接到本地运行的 mongodb 数据库 myapp。我有另一个调用 connectToMongo 的函数。我想用 mocha 测试这个其他功能。但是,我想这样做,以便在测试时,对 connectToMongo 的任何调用都将自动连接到我的 myapp_test 数据库,而不是我的正常数据库。

理想情况下(我认为)我想做这样的事情(其中 connectToMongoTestingDatabase 连接到 myapp_test):

var connectToMongo = require('./connectToMongo'),
    connectToMongoTestingDatabase = require('./connectToMongoTestingDatabase')
    registerUser = require('./registerUser');

testingLibrary.configureAlternateBehavior(connectToMongo, connectToMongoTestingDatabase);

it('should register a user', function (done) {

    registerUser({name: 'bob', password: 'password1'}, function (error, response) {
        connectToMongoTestingDatabase(function (error, database) {
            database.collection('users').findOne({name: 'bob'}, function (error, user) {
                expect(user).not.to.be.null;
                done();
            });
        });
    });

});

我一直在努力理解 Sinon.JS 库。我不知道 spy 、 stub 或模拟是否能满足这个需求,也不知道什么是 testingLibrary.configureAlternateBehavior 的等价物。

我想我还可以创建一些名为 global.MYAPP_TESTING 的全局变量,在我开始测试之前以及在 connectToMongo 的实现中将其设置为 true 如果 global.MYAPP_TESTING 为真,我可以连接到 myapp_test 数据库。但这似乎很糟糕。

在 JavaScript 单元测试中用一个函数的行为替换另一个函数的行为的最佳方法是什么?

最佳答案

如果您正在运行单元测试,那么您应该模拟函数中使用的所有外部依赖项(函数、对象),并检查它们是否被调用或获得所需的值。

为了在您的 ConnectToMongo 函数中进行集成测试,您应该从依赖于环境的配置中获取到数据库的连接字符串。 因此,当您运行测试时,您将环境设置为“测试”并获得一个配置对象,在开发过程中您可能有另一个配置对象(不同的设置),并且在实时环境中有一个 3d 配置。 查看此以获取有关制作环境相关配置的更多信息: Node.js setting up environment specific configs to be used with everyauth

关于node.js - 用另一个函数替换一个函数进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25463986/

相关文章:

javascript - 内部错误 : Metro Bundler has encountered an internal error [Duplicate Module]

Android flavor 测试 .R 文件

javascript - 如何在浏览器中设置 MochaJS 全局超时

node.js - Mocha 单元测试 Mongoose 模型

javascript - 使用 Node.js 流读取二进制数据

javascript - 如何限制API只在浏览器运行?

android - 是否可以将 Android 应用程序设置为连接到开发服务器?

ruby-on-rails - 使用 RSpec 测试 AJAX 密集型 Rails 应用程序

javascript - 为什么我的测试在我的( enzyme 模拟事件)同步事件处理程序之前完成?

node.js - 如何让 Docker 容器和 Node 应用程序在 EC2 上运行?