node.js - Sinon/沙盒测试说该函数从未被调用
问题描述
我想编写一个单元测试来检查是否调用了一个函数,但是我收到了错误:
submitDetails
submitDetails
sendEmail:
AssertionError: expected sendEmail to have been called exactly once, but it was called 0 times
从我可以看到我的函数submitDetails.submitDetails
清楚地运行该函数sendEmail.sendEmail
,但它说它从未被调用过。我也试过只使用'spy.call'而不是calledOnce
但我得到了相同的结果。
测试文件:
const submitDetails = require('../src/scripts/submitDetails')
const sendEmail = require('../src/lib/sendEmail')
describe('submitDetails', function () {
let sandbox = null
before(() => {
sandbox = sinon.createSandbox()
})
afterEach(() => {
sandbox.restore()
})
describe('submitDetails', () => {
let mockParams, result
beforeEach(async () => {
sandbox.spy(sendEmail, 'sendEmail')
})
it('sendEmail', () => {
expect(sendEmail.sendEmail).to.have.been.calledOnce()
})
})
})
SubmitDetails.js(正在测试的文件)
const { sendEmail } = require('../lib/sendEmail')
const submitDetails = {}
submitDetails.submitDetails = query => {
return sendEmail(query)
}
module.exports = submitDetails
解决方案
您没有submitDetails.submitDetails()
在测试用例中调用方法。这是工作示例:
sendEmail.ts
:
module.exports = {
sendEmail() {}
};
submitDetails.ts
:
const sendEmail = require('./sendEmail');
// @ts-ignore
const submitDetails = {};
// @ts-ignore
submitDetails.submitDetails = query => {
return sendEmail.sendEmail(query);
};
module.exports = submitDetails;
submitDetails.spec.ts
:
import { expect } from 'chai';
import sinon, { SinonSandbox, SinonSpy } from 'sinon';
const submitDetails = require('./submitDetails');
const sendEmail = require('./sendEmail');
describe('submitDetails', () => {
let sandbox: SinonSandbox;
before(() => {
sandbox = sinon.createSandbox();
});
afterEach(() => {
sandbox.restore();
});
describe('submitDetails', () => {
let sendEmailSpy: SinonSpy;
beforeEach(() => {
sendEmailSpy = sandbox.spy(sendEmail, 'sendEmail');
});
it('sendEmail', () => {
submitDetails.submitDetails();
sandbox.assert.calledOnce(sendEmailSpy);
expect(sendEmailSpy.calledOnce).to.be.true;
});
});
});
单元测试结果:
submitDetails
submitDetails
✓ sendEmail
1 passing (22ms)
源码:https ://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/58058653
推荐阅读
- node.js - 使用nodejs重置密码
- java - 检索对 Java 的弹性搜索响应的延迟
- javascript - 如何使用 jquery 更改元素内的文本?
- google-apps-script - 在特定下拉区域中进行更改时,向有权访问工作表的人员发送电子邮件
- javascript - 如何加载包含的 HTML 文件 element?
I want to re-use my custom web component. My web pages are primarily defined by HTML files, not Javascript. Is there any viable way to insert my component into my main file using HTML/Javascript/jQuer
- javascript - const 仅在解构时显示为未定义,而不是在重新分配给另一个 const 时
- html - 页眉没有到达边界
- node.js - npm scripts won't execute
- javascript - TypeError:无法读取 ReactJS Jest 测试中未定义的属性“标题”
- vue.js - Vue watcher triggered on creating sibling property