【发布时间】:2016-07-04 02:48:13
【问题描述】:
我想在我的代码中测试一个方法,该方法执行一组不同的函数......其中一个内部函数在调用时会发送一封电子邮件。
我想要的是避免此功能在运行测试时发送电子邮件。有没有办法做到这一点?
我想在我的代码中避开类似以下内容:
if (app.get('env') !== 'test')
我用的是Promises,我想测试的函数是这样的:
var emailService = require('../path/to/custom/service.js');
// This is the method I want to test
exports.sendKeyByEmail = function(email) {
return _getByEmail(email) // finds a user given an email
.then(function(user) {
if (!user) {
throw new UserNotFoundError();
}
user.key = _generateKey(); // generates a random hash
return user.save(); // saves the user (mongoose stuff...)
})
.then(function(user) {
// This is what I would like to mock during testing
return emailService.sendKey(user.email, user.key);
});
}
emailService.sendKey() 方法是发送电子邮件并返回 Promise 的方法。在测试期间,我希望它直接返回一个已履行的 Promise Promise.resolve(),而不是真正发送电子邮件。
【问题讨论】:
-
这种问题可以通过依赖注入解决——在你的测试中,你将
emailService的真实实现换成一个假装它已经发送邮件的实现。 -
@Starscream1984 这就是我想到的概念,谢谢指出!
标签: javascript node.js unit-testing testing mocking