【问题标题】:Spy function in mock file模拟文件中的间谍功能
【发布时间】:2020-04-14 14:32:28
【问题描述】:

我有一个名为 StateService 的模拟文件,位于 __mocks__ 文件夹中

export default {
    goTo: jest.fn(),
    goToNewTab: jest.fn(),
    goToPreviousAppState: jest.fn(),
    reload: jest.fn()
}

在我的测试中,我想监视goToNewTab 并检查该函数是否已被调用。 我现在正在做的是将模拟文件导入我的测试,然后在我的测试本身中,我像这样调用期望:

expect(StateService.goToNewTab).toHaveBeenCalled();

但是期望没有返回正值。

【问题讨论】:

  • 如果您在__mocks__ 文件夹中创建了模拟,则无需导入它,jest 会为您执行此操作(除非您另有说明)。您遵循的逻辑对我来说似乎是正确的,您能否添加相关代码的最小版本?
  • 问题是我需要在我的测试文件中从某个地方导入 StateService 吗?这就是问题所在,如果我导入mock文件,调用次数为0,否则我不知道该怎么办

标签: javascript unit-testing mocking jestjs


【解决方案1】:

假设您在services/StateService.js 中有一个文件(为简单起见,我将只定义goToNewTab 服务):

function goToNewTab() {
    // Your logic here.
}

export default {
    goToNewTab
};

然后,您在services/__mocks__/StateService.js 中创建此模块的模拟:

export default {
    goToNewTab: jest.fn()
};

现在,您正在测试一个调用goToNewTab 服务的模块。我们假设它放在utils/navigation.js

import StateService from '../services/StateService';

export default function() {
    StateService.goToNewTab();
}

使用模拟服务的此类模块的测试如下所示:

import StateService from '../services/StateService';
import navigation from './navigation';

jest.mock('../services/StateService');

it('Should mock call', () => {
    navigation();

    expect(StateService.goToNewTab).toHaveBeenCalled();
});

请注意,如果您在测试中需要StateService 模块,则需要显式调用该模块的jest.mock,如documentation 中所述。

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 1970-01-01
    • 2022-01-15
    • 2019-11-18
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多