首页 > 解决方案 > 如何测试一个调用另一个函数的函数?

问题描述

我有一个将 8 位整数数组转换为 x 位整数的函数。这个函数在 Jest 中有大量的单元测试。这个函数被称为convertArrayIntoInt()

我有另一个依赖于convertArrayIntoInt()被调用的函数getSignature()

/**
 * @param {Uint8Array} fileContents The file contents
 * @param {number} position The position in the file where the signature is.
 * @return {number} the 32 bit signature
 */
function getSignature(fileContents, position) {
    let signature = fileContents.slice(position, position + 4);
    signature = convertArrayIntoInt(signature);
    for(let s in Enums.Signatures) {
        if(signature === parseInt(s)) {
            return signature;
        }
    }
    return Enums.Signatures.BAD_SIGNATURE;
}

我想为此函数编写一个测试,测试是否Uint8Array.of(0x04, 0x03, 0x4b, 0x50), 0)返回0x04034b50Enums.BAD_SIGNATURE。我听说通过单元测试,您不想测试依赖于另一个函数输出的函数。我该如何在 Jest 中执行此操作?

标签: javascriptjestjs

解决方案


更新:当我将不同的文件合并到一个文件中时,看起来我的原始响应中有一些问题,我希望它可以像以前一样工作,但它没有确保将要注入的函数分开文件。

如前所述,单元测试应该只在模拟依赖项时测试它自身的功能。

我将函数移到单独的文件中,在一个文件中定义了所有函数,并在另一个测试中。

枚举.js

export const Enums = {
  Signatures: {
    SIGNATURE_1: 1,
    SIGNATURE_2: 2,
    SIGNATURE_3: 3,
    BAD_SIGNATURE: -1
  }
};

convertArrayIntoInt.js

export function convertArrayIntoInt(array) {
  // processing...
  return array.length;
}

getSignature.js

import { convertArrayIntoInt } from "./convertArrayIntoInt";
import { Enums } from "./enums";

export const getSignature = (fileContents, position) => {
  let signature = convertArrayIntoInt(
    fileContents.slice(position, position + 4)
  );

  for (let s in Enums.Signatures) {
    if (signature === parseInt(s, 10)) {
      return signature;
    }
  }

  return signature;
};

测试规范.js

import { getSignature } from "./getSignature";
import { Enums } from "./enums";
import * as convertArrayIntoIntModule from "./convertArrayIntoInt";

it("Function check", () => {
  // arrange
  const spy = jest.spyOn(convertArrayIntoIntModule, "convertArrayIntoInt");
  spy.mockReturnValue(Enums.Signatures.SIGNATURE_1);

  // act
  const expected = Enums.Signatures.SIGNATURE_1;
  const actual = getSignature([1, 2, 3, 4, 5, 6], 1);

  // assert
  expect(spy).toBeCalledTimes(1);
  expect(actual).toEqual(expected);

  // clean up
  spy.mockRestore();
});

你可以看看我创建的这个沙箱来测试类似于你的虚拟功能。


推荐阅读