【问题标题】:How to test branches of a function called by another function in Jest?如何测试 Jest 中另一个函数调用的函数的分支?
【发布时间】:2020-01-10 14:54:14
【问题描述】:

我有一个获取 npm 包版本的函数。该函数以这种方式分为三个:

**version.ts**

import fs from "fs";
import path from "path";

const getPathToPackageJson = (): string =>
  path.resolve(__dirname, "../", "../", "../", "../", "package.json");

const getPackageJson = (path: string): object =>
  fs.existsSync(path)
    ? JSON.parse(fs.readFileSync(path, { encoding: "utf8" }))
    : undefined;

const getPackageJsonVersion = (): string =>
  getPackageJson(getPathToPackageJson())["version"] || undefined;

export const versionUtils = {
  getPackageJsonVersion,
  getPathToPackageJson,
  getPackageJson
};

我想测试未定义的分支。现在我的测试看起来像这样:

**version.spec.ts**

import { versionUtils } from "./version.utils";

jest.mock("../../../../package.json", () => {
  return {
    version: "1.0.0"
  };
});

describe("getting the package.json version", () => {
  test("return 1.0.0", () => {
    expect(versionUtils.getPackageJsonVersion()).toEqual("1.0.0");
  });
});

所以,这部分有效,但我缺少未定义的分支以获得 100% 的覆盖率。这里的问题不是我是否真的需要它,而是我是否想要它。我愿意。

我用 jest.fn()、jest.spyOn()、jest.mock() 和 jest.clearAllMocks() 尝试了几种方法,但无济于事。有谁知道如何去测试未定义的回报?

【问题讨论】:

    标签: jestjs


    【解决方案1】:

    这最终奏效了:

    文件

    import fs from "fs";
    import path from "path";
    
    const getPathToPackageJson = (): string =>
      path.resolve(__dirname, "../", "../", "../", "../", "package.json");
    
    const getPackageJson = (p: string): object =>
      fs.existsSync(p)
        ? JSON.parse(fs.readFileSync(p, { encoding: "utf8" }))
        : undefined;
    
    const getPackageJsonVersion = (): string => {
      const p = getPathToPackageJson();
      const packageJson = getPackageJson(p);
      if (packageJson) return packageJson["version"];
      else return undefined;
    };
    
    export const versionUtils = {
      getPackageJsonVersion
    };
    

    测试

    import { versionUtils } from "./version.utils";
    import fs from "fs";
    
    jest.mock("fs");
    
    describe("getting the package.json version", () => {
      test("return undefined if file not found", () => {
        jest.spyOn(fs, "existsSync").mockReturnValue(false);
        const version = versionUtils.getPackageJsonVersion();
        expect(version).toBeUndefined();
      });
      test("return 1.0.0", () => {
        const packageJson = '{ "version": "1.0.0" }';
        jest.spyOn(fs, "existsSync").mockReturnValue(true);
        jest.spyOn(fs, "readFileSync").mockReturnValue(packageJson);
        const version = versionUtils.getPackageJsonVersion();
        expect(version).toEqual("1.0.0");
      });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 2018-11-20
      • 2019-03-10
      • 2017-06-12
      • 2014-05-08
      • 2022-01-24
      • 1970-01-01
      相关资源
      最近更新 更多