我有一个通过命名的导入WebClient使用@slack/web-api包的应用程序。
我想测试一个控制器,它使用了一个模型,而这个模型又使用了slack api。
如下所示:
// 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);
})这是我的代码的简化版本,因为我的代码会非常大,并且我已经测试了所有其他方面,并且我得到了所需的响应。我的问题不是测试本身,而是mock,因为测试的代码是可访问的,但我在如何断言它方面缺少一些东西。
我还将typescript与nodejs一起用于这个应用程序。
提前谢谢。
发布于 2021-05-19 22:45:06
问题是您正在测试controller.ts,但是@slack/web-api是从model.ts导入的。然而,即使控制器导入了模型,jest也不会模仿它。您只能模拟直接导入到controller.ts中的库(在本例中)。
我的建议是模拟model.ts本身,而不是它的依赖项。
https://stackoverflow.com/questions/67604761
复制相似问题