【问题标题】:How to test a return value of a mock function in jest如何在玩笑中测试模拟函数的返回值
【发布时间】:2018-12-28 21:42:32
【问题描述】:

我想开玩笑地测试一个模拟函数的返回值。

在下面的代码中我想模拟 fs 模块的 mkdirSync 函数

const fs = require("fs");


describe("Testing mock fs.mkdirSync", () => {
    fs.mkdirSync = jest.fn().mockReturnValue(5);
    fs.mkdirSync("./apple");

    it("fs.mkdirSync must have been called", () => {
        expect(fs.mkdirSync).toHaveBeenCalled();
    });

    //This test fails with TypeError: Cannot read property '0' of undefined

    it("fs.mkdirSync last return value must be 5", () => {
        expect(fs.mkdirSync.mock.results[0].value).toBe(5);
    });



});

第二次测试失败并出现 TypeError: Cannot read property '0' of undefined

【问题讨论】:

  • 在您的示例中,您的操作完全按照 jest 文档的建议进行。我复制粘贴了你的代码,两个测试都开玩笑地通过了。您遗漏了一些导致测试失败的内容,因为您的代码很好。
  • 我已经在全球范围内安装了 jest,我的 jest 版本是 v20.04,我正在使用 jest --watch 运行测试
  • 我可以知道您正在使用哪个版本的 jest 以及您如何运行测试
  • 我玩的是 23.4.0 版。我正在运行一个 npm 脚本"scripts": { ... "test": "jest" }。该代码位于 .test.js 文件中。全部在使用 create-react-app 创建的项目中。
  • 但是我的 create-react-app 安装了 jest 版本 20.0.4 你是如何在 create-react-app 中获得最新版本的 jest 而不弹出它???

标签: reactjs testing jestjs


【解决方案1】:

您的代码是正确的,但您的 jest 安装版本已过时。

将您的测试复制粘贴到新的 create-react-app 样板中并运行 jest 将导致问题中描述的行为。

运行 npm install jest --save-dev 以安装最新版本的 jest。

现在运行 jest 应该会导致两个测试都通过。

【讨论】:

  • 感谢您的回答,但我想知道 jest 默认情况下会通过 react 脚本与 create-react-app 一起安装,但为什么不安装最新版本的 jest。
【解决方案2】:

为什么要测试一个开玩笑的模拟函数的返回值?此时您正在测试jest

您可以将fs.mkdirSync 分配给一个变量并测试该值,因为这是返回值:

const result = fs.mkdirSync("./apple");
it("fs.mkdirSync last return value must be 5", () => {
    expect(result).toBe(5);
});

【讨论】:

  • 我已经过度简化了这个例子,假设我的模拟函数可能在另一个函数中被调用,并且该函数的返回值取决于传递给模拟函数的参数。在这种情况下如何测试模拟功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 2022-01-21
  • 2021-04-27
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2018-09-18
相关资源
最近更新 更多