【问题标题】:How to spyOn an exported standalone function using javascript jest?如何使用 javascript jest 监视导出的独立函数?
【发布时间】:2021-04-12 19:10:41
【问题描述】:

这是一个非常简单的场景,但我一直在努力寻找答案。

helpers.ts:

export function foo() {
    bar();
}

export function bar() {
    // do something
}

helpers.spec.ts:

import { foo, bar } from "./helpers";

describe("tests", () => {
    it("example test", () => {
        const barSpy = // how can i set this up?
        foo();
        expect(barSpy).toHaveBeenCalled();
    });
});

我不能做const spy = jest.spyOn(baz, 'bar');,因为我没有模块/类来代替“baz”。它只是一个导出的函数。

编辑: Jest mock inner function 已被建议为重复,但不幸的是它对我的方案没有帮助。

该问题的解决方案:

  • 移动到单独的模块:我无法为我的场景执行此操作。如果我在我的应用程序中测试每个函数,这将导致我创建 10 个不理想的新文件。 (澄清一下,我认为这个解决方案可以工作,但我不能在我的场景中使用它。我已经在这个测试文件中成功地模拟了一个单独的文件函数。)

  • 将模块导入自身:

helpers.spec.ts:

import * as helpers from "./helpers";

describe("tests", () => {
    it("example test", () => {
        const barSpy = jest.spyOn(helpers, 'bar');
        foo();
        expect(barSpy).toHaveBeenCalled();
    });
});

结果:

expect(jest.fn()).toHaveBeenCalled()

Expected number of calls: >= 1
Received number of calls:    0

【问题讨论】:

  • 这能回答你的问题吗? Jest mock inner function
  • 不幸的是,这并没有回答我的问题。在该场景中进行模拟在 spec.ts 文件中有效,但在原始文件中无效。原始文件仍然调用实际的 bar() 而不是模拟的 bar()

标签: javascript typescript unit-testing jestjs mocking


【解决方案1】:

这是封闭的解决方案:

export function bar() {
  // do something
}

export function foo() {
  exports.bar();   // <-- have to change to exports.bar() instead of bar()
  // or this.bar(); would also work.
}

import * as utils from './utils';

describe('tests', () => {
  it('example test', () => {
    const barSpy = jest.spyOn(utils, 'bar');
    utils.foo();
    expect(barSpy).toHaveBeenCalled();
  });
});

或者看看这个duplicated question

【讨论】:

  • exports.bar() 依赖于 ES 模块被转译为 CommonJS 的事实,这通常是一个错误。
  • 不幸的是,我不能在我的场景中使用exports.bar()。但这确实有效!我将与我的团队核实是否可以在我们的场景中使用导出。
  • 我发现 this.bar() 也有效。我绝对可以使用它(我意识到这与使用导出相同)。我会接受这个作为答案,但做一个小的编辑来说明这也有效。
猜你喜欢
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2018-10-15
  • 1970-01-01
  • 2015-12-29
  • 2018-11-24
相关资源
最近更新 更多