如何判断是否调用了另一个对象方法

时间:2021-03-16 14:24:06

标签: javascript node.js jestjs

我有我的函数对象,我想测试一个方法是否调用了另一个方法,但 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();
    })
})

package.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"
  }
}

2 个答案:

答案 0 :(得分:1)

jest.spyOn(funcObjectOutput, 'firstFunc') 用模拟函数替换 funcObjectOutput['firstFunc']。所以 firstFuncSpy 是模拟的而不是原始的。并且 expect(firstFuncSpy).toHaveBeenCalled() 检查模拟函数是否已被调用。但是 secondFunc 调用了原来的 firstFunc

jest.spyOn的代码。 https://github.com/facebook/jest/blob/dd1309652334ab14544cf3ecb177faae68059832/packages/jest-mock/src/index.ts#L951

答案 1 :(得分:0)

目前,在 firstFunc() 中调用的 secondFunc() 将是原始函数,而不是间谍版本。

为了监视或模拟 firstFunc() 函数,您需要检索它的引用。这样,当secondFunc()函数被调用时,被监听的firstFunc()函数就会被调用。有关详细信息,请参阅此 How to mock specific module function?

例如

index.js

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

  obj.firstFunc = firstFunc;
  obj.secondFunc = secondFunc;
  return obj;
};

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();
  });
});

测试结果:

 PASS  examples/66657164/index.test.js
  second func tests
    ✓ should call first func (19 ms)

  console.log
    first func!

      at Object.firstFunc (examples/66657164/index.js:4:13)

  console.log
    second func!

      at Object.secondFunc (examples/66657164/index.js:8:13)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.69 s
相关问题