1

我想在本地笔记本电脑上使用 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 参考错误
4

0 回答 0