jest 中如何 mock 类其中的部分函数?`

2021-01-25 20:07:44 +08:00
 Flands
import { Recorder, Pubsub } from "trident";
const pubsub = new Pubsub();

export class SmartRecorder extends Recorder {
  constructor(props) {
    super(props);
  }
  start() {
    pubsub.subscribe('androidData', androidDataHandler);
    return super.start();
  }
}

使用 mockImplementation 方式,提示 类型“typeof Recorder”上不存在属性“mockImplementation”as转换后无效。 使用 jest.requireActual,直接没法运行。

试了两天搜了很多方法都不行,请问下大佬们怎么编写啊?

1188 次点击
所在节点    程序员
3 条回复
theohateonion
2021-01-26 10:19:05 +08:00
建议贴下测试代码先
Flands
2021-01-26 11:27:20 +08:00
test
```ts
const mockStart = jest.fn();
const mockInit = jest.fn();
const mockPublish = jest.fn();
const mockSubscribe = jest.fn();

// 第一种
import { Pubsub, Recorder } from "trident";

jest.mock("trident", () => {
return {
Pubsub: () => {
return class {
publish() {
return mockPublish;
}
subscribe() {
return mockSubscribe;
}
};
}
};
});


// 第二种
import * as trident from "@cloud/trident-js-sdk/src";

const mockPubsub = jest.spyOn(trident, "Pubsub");
(mockPubsub as jest.Mock).mockImplementation(() => {
return {
publish: mockPublish,
subscribe: mockSubscribe
};
});

const mockRecorder = jest.spyOn(trident, "Recorder");
(mockRecorder as jest.Mock).mockImplementation(() => {
const original = jest.requireActual('@cloud/trident-js-sdk/src');
return {
...original,
start: mockStart,
};
});

```


主要还是 `mockImplementation` 和 `requireActual`各种组合起来,虽然看着挺离谱也没法运行,但尝试了很多写法都不行。。
Flands
2021-01-26 15:22:22 +08:00
不要在意 `@cloud/trident-js-sdk/src` 这个,原本打算脱敏的,结果没脱全。实际上都是 `trident`

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/748279

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX