Typescript 如何为jest模拟SlackWebAPI

Typescript 如何为jest模拟SlackWebAPI,typescript,jestjs,mocking,slack,Typescript,Jestjs,Mocking,Slack,我有一个应用程序正在通过名为importWebClient的程序包使用@slack/webapi程序包 我想测试一个使用模型的控制器,该模型反过来使用SlackWebAPI 大概是这样的: // model.ts import { WebClient } from '@slack/web-api'; export default (token) => { const slackWebClient = new WebClient(token); return { func:

我有一个应用程序正在通过名为import
WebClient
的程序包使用
@slack/webapi
程序包

我想测试一个使用模型的控制器,该模型反过来使用SlackWebAPI

大概是这样的:

// model.ts
import { WebClient } from '@slack/web-api';

export default (token) => {
  const slackWebClient = new WebClient(token);
  return {
    func: () => slackWebClient.chat.postMessage(...)
  }
}

// controller.ts
import model from './model'

export const controller = async () => {
  const m = model(token)
  await model.func()
} 
至于我的测试,我尝试模拟这个包,然后测试
chat.postMessage
函数的行为,但是我一直得到0个调用,尽管在它旁边添加了一个console.log,我得到了一个输出

这是我的测试:

import { controller } from '../controller';

const mSlack = {
  chat: {
    postMessage: jest.fn(),
  },
};

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

it('test controller', async () => {
  await controller()

  expect(mSlack.chat.postMessage).toHaveBeenCalledTimes(1);
})
这是我的代码的简化版本,因为我的代码非常大,我已经测试了所有其他方面,并且得到了期望的响应。我的问题不在于测试本身,而在于模拟,因为测试代码是可访问的,但我缺少一些关于如何对其进行断言的内容

我还在这个应用程序中使用带有nodejs的typescript


提前感谢。

问题是您正在测试
controller.ts
,但是
@slack/web api
是从
model.ts
导入的。即使控制器导入模型,jest也不会模仿它。您只能在
controller.ts
中直接导入模拟库(在本例中)


我的建议是模拟
model.ts
本身,而不是它的依赖关系。

我不认为是这样,因为我有其他模型,我在模拟它们的依赖关系,我得到了期望的结果。只有在slack api中我才面临这个问题。你能给出这些情况的例子吗?你有没有尝试将mock值设置为null以查看它是否抛出错误?jest.mock('@slack/web api',()=>{return{WebClient:()=>null};});我遇到的问题是我重置模拟的方式,谢谢你的帮助,非常感谢