javascript - 如何测试一个调用另一个函数的函数?
问题描述
我有一个将 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)
返回0x04034b50
或Enums.BAD_SIGNATURE
。我听说通过单元测试,您不想测试依赖于另一个函数输出的函数。我该如何在 Jest 中执行此操作?
解决方案
更新:当我将不同的文件合并到一个文件中时,看起来我的原始响应中有一些问题,我希望它可以像以前一样工作,但它没有确保将要注入的函数分开文件。
如前所述,单元测试应该只在模拟依赖项时测试它自身的功能。
我将函数移到单独的文件中,在一个文件中定义了所有函数,并在另一个测试中。
枚举.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();
});
你可以看看我创建的这个沙箱来测试类似于你的虚拟功能。
推荐阅读
- autohotkey - 用于多个按键的基本 AutoHotKey
- matlab - 如何在给定值的行数组中删除一行
- google-app-engine - Go 上服务器的 CORS 标头问题
- highcharts - 无法显示类别标签
- azure-ad-b2c - 使用验证技术配置文件来停止正在运行的函数
- ios - 如何启用 Xcode 调试消息
- swift - 如何在 ImageView 中获取图像的路径
- java - 致命错误编译:无法运行 ecj 编译器:无法识别的选项:--module-version
- gradle - Gradle 外部化配置
- java - 传递方法参考 NoClassDefFoundError