我有一个名为 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/