我想在本地笔记本电脑上使用 Jest 测试用 TypeScript 编写的 Google Apps 脚本代码。代码有一个特定于 GAS 的方法调用,Logger.log
我必须给测试人员一个模拟函数。
要测试的代码./src/code.ts
:
export function hello(name: string): string {
return `hello ${name}`;
}
function main(): void {
Logger.log(hello('yamada'));
}
main();
测试代码./__tests__/code.spec.ts
:
import {hello} from '../src/code';
class Logger {
static log(msg: string): void {
console.log(msg);
};
}
describe('test for hello function', () => {
beforeAll(() => {
});
it('adds "hello" before the argument and returns them', () => {
const result = hello('john');
expect(result).toBe('hello john');
});
});
当我执行时,我希望测试能够运行并成功npx jest
,但我得到了:
FAIL __tests__/code.spec.ts
● Test suite failed to run
ReferenceError: Logger is not defined
4 |
5 | function main(): void {
> 6 | Logger.log(hello('yamada'));
| ^
7 | }
8 |
9 | main();
at main (src/code.ts:6:3)
at Object.<anonymous> (src/code.ts:9:1)
at Object.<anonymous> (__tests__/code.spec.ts:1:1)
当我./src/code.ts
使用编译时npx tsc
,它成功了。删除发出的文件后./src/code.js
,我npx jest
再次运行,然后出现相同的消息。
测试人员似乎在远程文件中找到了函数的定义,但没有在同一个文件hello
中找到类。Logger
这看起来很奇怪和好奇。
我应该怎么做才能让模拟类Logger
及其方法log
工作。
环境:
命令 | 版本 |
---|---|
节点 | 16.13.0 |
表扣 | 2.4.1 |
tsc | 4.4.4 |
笑话 | 27.3.1 |
./package.json
{
"name": "sample2",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "jest",
"dev": "tsc src/code.ts",
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@google/clasp": "^2.4.1",
"@types/jest": "^27.0.3",
"@types/node": "^16.11.7",
"@typescript-eslint/eslint-plugin": "^5.3.1",
"@typescript-eslint/parser": "^5.3.1",
"eslint": "^8.2.0",
"jest": "^27.3.1",
"ts-jest": "^27.0.7",
"ts-node": "^10.4.0",
"typescript": "^4.4.4"
},
"dependencies": {
"@types/google-apps-script": "^1.0.39",
"replace-in-file": "^6.3.2"
}
}
./jest.config.js
module.exports = {
transform: {
"^.+\\.ts$": "ts-jest",
},
globals: {
},
};
我试过了:
设置
globals
和保持类Logger
./jest.config.js
module.exports = { ... , globals: { Logger: {} }, };
结果如下:
TypeError: Logger.log is not a function
已
Logger
定义,而我的定义Logger.log
不起作用。设置
globals
和定义Logger.log
:./__tests__/code.spec.ts
import {hello} from '../src/code'; describe('test for hello function', () => { beforeAll(() => { Logger.log = jest.fn(msg => { console.log(msg); }); }); ... });
这导致了
TypeError
.取消设置
globals
并保留课程Logger
:ReferenceError: Logger is not defined
取消设置
globals
和定义Logger.log
:这导致
ReferenceError
.设置
globals
,保持类和设置间谍:./__tests__/code.spec.ts
beforeAll(() => { ... , jest.spyOn(Logger, 'log'); });
这导致了
TypeError
.设置
globals
、定义Logger.log
和设置间谍:那件事发生了
TypeError
。取消
globals
设置,保留类并设置间谍:那个结果
ReferenceError
。取消设置
globals
,定义Logger.log
和设置间谍:这导致
ReferenceError
.
下表总结了这些结果:
globals |
模拟类型 | 间谍 | 错误类型 |
---|---|---|---|
放 | 类记录器 | X | 类型错误 |
放 | 记录器.log | X | 类型错误 |
未设置 | 类记录器 | X | 参考错误 |
未设置 | 记录器.log | X | 参考错误 |
放 | 类记录器 | ○ | 类型错误 |
放 | 记录器.log | ○ | 类型错误 |
未设置 | 类记录器 | ○ | 参考错误 |
未设置 | 记录器.log | ○ | 参考错误 |