模拟 Slack Web Api 笑话

ssh*_*h98 4 node.js typescript jestjs

我有两个文件,其中一个是我初始化 slack Web API 客户端、发布一条消息,并根据模拟值对其进行测试:

main.ts:

import { WebClient } from '@slack/web-api';
const slack = new WebClient(process.env.SLACK_API_KEY as string);

slack.chat.postMessage({...});
Run Code Online (Sandbox Code Playgroud)

test.ts

import { WebClient } from '@slack/web-api';
let slack: WebClient;

beforeAll(async () => {
  slack = new WebClient();
});

jest.mock('@slack/web-api', () => {
  return {
    chat: jest.fn(),
    postMessage: jest.fn(),
  };
});

describe('test', () => {
  it("tests slack message", async () => {
    expect(slack.chat.postMessage).toBeCalledWith({...});
  })
})
Run Code Online (Sandbox Code Playgroud)

问题是当我运行此代码时出现以下错误:TypeError: web_api_1.WebClient is not a constructor

我尝试了各种不同的方法,包括模拟模块、使用esModule: true而不是定义 WebClient。我的问题是我做错了什么?

sli*_*wp2 9

您没有正确模拟@slack/web-api包和WebClient构造函数。

\n

此外,您忘记导入main.ts模块。

\n

例如

\n

main.ts:

\n
import { WebClient } from '@slack/web-api';\nconst slack = new WebClient(process.env.SLACK_API_KEY as string);\n\nslack.chat.postMessage({\n  text: 'Hello world!',\n  channel: '123',\n});\n
Run Code Online (Sandbox Code Playgroud)\n

main.test.ts:

\n
import { WebClient } from '@slack/web-api';\nimport './main';\n\njest.mock('@slack/web-api', () => {\n  const mSlack = {\n    chat: {\n      postMessage: jest.fn(),\n    },\n  };\n  return { WebClient: jest.fn(() => mSlack) };\n});\n\ndescribe('test', () => {\n  let slack: WebClient;\n  beforeAll(() => {\n    slack = new WebClient();\n  });\n  it('tests slack message', async () => {\n    expect(slack.chat.postMessage).toBeCalledWith({ text: 'Hello world!', channel: '123' });\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n

单元测试结果:

\n
 PASS  examples/66991895/main.test.ts (7.253 s)\n  test\n    \xe2\x9c\x93 tests slack message (2 ms)\n\nTest Suites: 1 passed, 1 total\nTests:       1 passed, 1 total\nSnapshots:   0 total\nTime:        8.245 s\n
Run Code Online (Sandbox Code Playgroud)\n