首页 > 解决方案 > 如何判断是否调用了另一个对象方法

问题描述

我有我的函数对象,我想测试一个方法是否调用了另一个方法,但是 spy 似乎失败了,因为测试表明这是因为该函数根本没有被调用。我正在添加代码。
index.js

const funcObject = () => {
    const firstFunc = () => {
        console.log('first func!')
    };
    const secondFunc = () => {
        firstFunc();
        console.log('second func!');
    }
    return {
        firstFunc,
        secondFunc
    };
};

module.exports = funcObject;

index.test.js

const funcObject = require('./index');

describe('second func tests', () => {
    it('should call first func', () => {
        const funcObjectOutput = funcObject();
        const firstFuncSpy = jest.spyOn(funcObjectOutput, 'firstFunc');
        funcObjectOutput.secondFunc();

        expect(firstFuncSpy).toHaveBeenCalled();
    })
})

包.json

{
  "name": "jest-mock",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "jest"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/jest": "^26.0.20",
    "jest": "^26.6.3"
  }
}

标签: javascriptnode.jsjestjs

解决方案


jest.spyOn(funcObjectOutput, 'firstFunc')替换funcObjectOutput['firstFunc']为模拟函数。firstFuncSpy模拟的而不是原始的也是如此。并expect(firstFuncSpy).toHaveBeenCalled()检查是否已调用模拟函数。而是secondFunc调用原来的firstFunc

见代码jest.spyOnhttps://github.com/facebook/jest/blob/dd1309652334ab14544cf3ecb177faae68059832/packages/jest-mock/src/index.ts#L951


推荐阅读