首页 > 解决方案 > 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

标签: node.jsunit-testingsinonsinon-chai

解决方案


您没有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


推荐阅读