【问题标题】:Replace a function with another function for testing用另一个函数替换一个函数进行测试
【发布时间】:2014-10-17 07:25:36
【问题描述】:

我有一个名为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 库。我不知道间谍、存根或模拟是否能满足这种需求,也不知道 testingLibrary.configureAlternateBehavior 的等价物是什么。

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

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

【问题讨论】:

  • 这通常是 DI(依赖注入)模式的用途。制作一组一次性功能,您只需 require() 代替 mongo 业务。

标签: node.js testing mocha.js


【解决方案1】:

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

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

【讨论】:

  • 在运行 mocha 之前结束了 process.env.NODE_ENV = 'test',然后使用配置脚本根据 NODE_ENV 的值设置正确的 mongo url,并在连接时要求 connectToMongo 中的配置。跨度>
猜你喜欢
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多