Jest - 模拟函数调用

mat*_*t-p 28 javascript unit-testing jestjs

我试图模拟一个函数调用,并期望它在其中调用一次其他函数.

myFunctions.test.js

import { resetModal } from '../myFunctions.js';

describe('resetModal', () => {
  it('calls the clearSomethingInModal function', () => {
    const clearSomethingInModal = jest.fn();
    resetCreationModal();
    expect(clearSomethingInModal.mock.calls.length).toBe(1);
  })
})
Run Code Online (Sandbox Code Playgroud)

myFunctions.js

export resetModal() {
  clearSomethingInModal()
}
Run Code Online (Sandbox Code Playgroud)

但是,Jest输出说没有被调用.如果有人能建议如何最好地做到这一点,我将非常感激.

And*_*rle 35

因为你们嘲笑你的方法没有作用clearSomethingInModal只在您的测试文件的情况下,这样clearSomethingInModalmyFunctions.js依然是原来的.重点是你不能模拟直接创建的东西 myFunctions.js.你唯一可以嘲笑的是

  1. 您导入的模块myFunctions.js,例如import clearSomethingInModal from 'clearSomethingInModal'
  2. 从测试中调用它们时传递给函数的回调

如果您将其myFunctions.js视为一个黑盒子,您可以控制其中的内容,例如导入或函数参数,以及您可以在哪里测试出来的内容,这是有道理的.但是你无法测试盒子里面发生的事情.

以下是反映列表中2个点的两个示例

myFunctions.test.js

import { resetModal } from '../myFunctions.js';
import clearSomethingInModal from 'clearSomethingInModal';

jest.mock('clearSomethingInModal', () => jest.fn())

describe('resetModal', () => {
  it('calls the clearSomethingInModal function', () => {
    resetCreationModal();
    expect(clearSomethingInModal.mock.calls.length).toBe(1);
  })
})
Run Code Online (Sandbox Code Playgroud)

myFunctions.js

import clearSomethingInModal from 'clearSomethingInModal';

export resetModal() {
  clearSomethingInModal()
}
Run Code Online (Sandbox Code Playgroud)

myFunctions.test.js

import { resetModal } from '../myFunctions.js';

describe('resetModal', () => {
  it('calls the clearSomethingInModal function', () => {
    const clearSomethingInModal = jest.fn();
    resetCreationModal(clearSomethingInModal);
    expect(clearSomethingInModal.mock.calls.length).toBe(1);
  })
})
Run Code Online (Sandbox Code Playgroud)

myFunctions.js

export resetModal(clearSomethingInModal) {
  clearSomethingInModal()
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢安德里亚斯,这是一个很好的解释。因此,我认为在不更改函数结构的情况下,我无法按照我想要的方式进行测试。那么,(a)这是否意味着功能设计方面的问题,以及(b)以当前形式表示,您可以对其应用任何有效的测试吗?请注意,“ resetModal”函数还调用了其中的许多其他函数,为了简洁起见, (2认同)