使用 TS 中的 Jest 进行模拟段分析

lau*_*lla 5 javascript tdd unit-testing typescript jestjs

我正在尝试编写一个单元测试来检查是否调用了 Analytics 的 .track 方法。由于某种原因,测试不断失败,尽管通过 http 调用该函数确实触发了调用。我不确定我是否嘲笑它错误,或者问题可能是什么?

索引.ts:

import { Request } from "../types"
import { getSecret } from "../src/secrets"
import Analytics from "analytics-node"

const logger = (req: Request) => {
    const analytics = new Analytics(<string>process.env.WRITE_KEY);
    return analytics.track({
        userId: req.userId
    });
}

export default logger
Run Code Online (Sandbox Code Playgroud)

索引.test.ts:

jest.mock('analytics-node');
import { Request } from "../types"
import logger from "./index"
import Analytics from "analytics-node"

const mockAnalytics = new Analytics(process.env.WRITE_KEY = 'test');

describe('Logger tests', () => {
    it(`Should call analytics.track`, () => {
        const request: Request = {
            userId: 23
        }
        return logger(request).then(() => {
            expect(mockAnalytics.track).toHaveBeenCalled()
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

sli*_*wp2 4

您正在通过调用使用自动模拟jest.mock(\'analytics-node\')

\n
\n

调用 jest.mock(\'analytics-node\') 返回一个有用的“自动模拟”,您可以使用它来监视对类构造函数及其所有方法的调用。它将 ES6 类替换为模拟构造函数,并将其所有方法替换为始终返回的模拟函数undefined。方法调用保存在theAutomaticMock.mock.instances[index].methodName.mock.calls.

\n
\n

例如

\n

index.ts:

\n
import Analytics from \'analytics-node\';\n\nexport interface Request {\n  userId: string | number;\n}\n\nconst logger = (req: Request) => {\n  const analytics = new Analytics(<string>process.env.WRITE_KEY);\n  return analytics.track({\n    userId: req.userId,\n    anonymousId: 1,\n    event: \'\',\n  });\n};\n\nexport default logger;\n
Run Code Online (Sandbox Code Playgroud)\n

index.test.ts:

\n
import logger, { Request } from \'./\';\nimport Analytics from \'analytics-node\';\n\njest.mock(\'analytics-node\');\nconst mockAnalytics = Analytics as jest.MockedClass<typeof Analytics>;\n\ndescribe(\'Logger tests\', () => {\n  afterAll(() => {\n    jest.resetAllMocks();\n  });\n  it(`Should call analytics.track`, () => {\n    const WRITE_KEY = process.env.WRITE_KEY;\n    process.env.WRITE_KEY = \'test key\';\n    const request: Request = {\n      userId: 23,\n    };\n    logger(request);\n    expect(mockAnalytics).toBeCalledWith(\'test key\');\n    expect(mockAnalytics.mock.instances[0].track).toHaveBeenCalled();\n    process.env.WRITE_KEY = WRITE_KEY;\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n

单元测试结果:

\n
 PASS  examples/65412302/index.test.ts\n  Logger tests\n    \xe2\x9c\x93 Should call analytics.track (4 ms)\n\n----------|---------|----------|---------|---------|-------------------\nFile      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n----------|---------|----------|---------|---------|-------------------\nAll files |     100 |      100 |     100 |     100 |                   \n index.ts |     100 |      100 |     100 |     100 |                   \n----------|---------|----------|---------|---------|-------------------\nTest Suites: 1 passed, 1 total\nTests:       1 passed, 1 total\nSnapshots:   0 total\nTime:        5.954 s\n
Run Code Online (Sandbox Code Playgroud)\n