我有以下代码,我正在尝试创建单元测试 确保sendToGoogle函数正常工作,因此我对gmail.users.messages的send方法进行了存根处理,并期望该方法由sendToGoogle方法调用,但出现此错误
AssertionError:预期发送至少已被调用一次,但是 从来没有叫过
// email.js
const helper = require('./helper')
/**
* sendEmail - sends an email to a given address
*
* @param {String} to - The address of the recipient.
* @param {String} from - The address of the sender.
* @param {String} subject - subject of the email.
* @param {String} bodyText - text of the email.
**/
function sendEmail(to, from, subject, bodyText) {
const oAuthClient = helper.getAuth(process.env.CLIENT_ID, process.env.PRIVATE_KEY, from);
const emailLines = helper.createEmail(to, from, subject, bodyText);
helper.sendToGoogle(oAuthClient, from, emailLines);
}
module.exports.sendEmail = sendEmail;
这是包含我的代码的helper.js
// helper.js
const {google} = require('googleapis');
const base64 = require('base-64');
const gmail = google.gmail("v1");
/**
* createEmail - createEmail an email message
*
* @param {String} to - The address of the recipient.
* @param {String} from - The address of the sender.
* @param {String} subject - subject of the email.
* @param {String} bodyText - text of the email.
* @return {String} - Message to send.
**/
const createEmail = function (to, from, subject, bodyText) {
const emailLines = ["Content-Type: text/plain; charset=\"UTF-8\"\n",
"MIME-Version: 1.0\n",
"Content-Transfer-Encoding: 7bit\n",
"to: ", to, "\n",
"from: ", from, "\n",
"subject: ", subject, "\n\n",
bodyText
].join('')
const messageBase64 = base64.encode(emailLines.trim()).replace(/\+/g, '-').replace(/\//g, '_');
return messageBase64
}
/**
*
*
* @param {String} clientKey
* @param {String} privateKey
* @param {String} from
* @returns
*/
const getAuth = function (clientKey, privateKey, from) {
return new google.auth.JWT(
clientKey,
null,
privateKey,
['https://www.googleapis.com/auth/gmail.send'],
from
);
}
/**
* @param {String} oAuthClient
* @param {String} from
* @param {String} message
*/
const sendToGoogle = function (oAuthClient, from, message) {
console.log("sendtogoogle calllled")
gmail.users.messages.send({
auth: oAuthClient,
userId: from,
resource: {
raw: message
}
}, function (err, resp) {
if (!err) {
return resp
}
console.error(err)
});
}
module.exports.createEmail = createEmail
module.exports.getAuth = getAuth
module.exports.sendToGoogle = sendToGoogle
这是单元测试文件
// email.spec.js
it ("send to gmail",function(){
const gmail = google.gmail("v1");
const SendStub = sinon.stub(gmail.users.messages, 'send').returns('test')
const result = helper.sendToGoogle("oAuthClient", from,"message")
SendStub.should.have.been.called
})
感谢您的帮助。
答案 0 :(得分:0)
Sinon文档没有更新,我也浪费了太多时间,发现解决方案适合我的情况。
sandbox.stub(gmail.users.messages, 'send').callsFake(() => {
return 'test';
});
答案 1 :(得分:0)
我已通过导出gmail并将其导入我的测试文件中解决了该问题, 所以我存根相同的实例。