Jest SpyOn选择正确的过载

kadbb459  于 11个月前  发布在  Jest
关注(0)|答案(2)|浏览(156)

我有一个类,它有两个重载的方法。

public static create<M extends Model>(
    this: ModelStatic<M>,
    values?: M['_creationAttributes'],
    options?: CreateOptions<M['_attributes']>
  ): Promise<M>;
  public static create<M extends Model>(
    this: ModelStatic<M>,
    values: M['_creationAttributes'],
    options: CreateOptions<M['_attributes']> & { returning: false }
  ): Promise<void>;

字符串
在我的单元测试中,我试图使用jest.spyOn来模拟第一个方法,但是jest只看到返回Promise<void>的方法。

const mockInsightCreate = jest.spyOn(Insight, "create");
mockInsightCreate.mockReturnValue(Promise.resolve()); // here I need to return an object of type - Insight


有没有办法让spyOn选择第一个返回Promise<M>的方法?

import {
    Model,
} from "sequelize-typescript";

... 

export default class Insight extends Model<Insight> {

f45qwnt8

f45qwnt81#

我知道这个问题已经很老了,但贝娄是我对任何可能遇到同样问题的人的回答。
目前还没有办法指示spyOn应该使用哪个重载签名。一个解决方案是将值转换为spyOn期望的任何值。

mySpy.mockReturnValue(Promise.resolve(myObj) as unknown as void);
mySpy.mockResolveValue(myObj as unknown as void);

字符串
然而,我个人倾向于尽可能避免强制类型化系统。另一个不需要任何类型化的解决方法是模拟整个方法实现。

mySpy.mockImplementation(() => Promise.resolve(myObj));

x33g5p2x

x33g5p2x2#

因为你似乎不能选择要模拟哪个重载,所以在你的例子中,可以使用spread运算符来模拟任何同名函数。我在node-ipc库中用connectToNet成功地做到了这一点,它有几个重载。在我的例子中,我想执行回调函数。

import NodeIPC from "node-ipc";

const connectToNet = jest.spyOn(NodeIPC, "connectToNet");

connectToNet.mockImplementation((...args) => {
  // I don't normally like using `any`, so suggestions are welcome.
  const callback = (args as any)[3];
  if (callback) {
    callback();
  }
});

字符串
以下是重载定义:

connectToNet(id: string, callback?: () => void): void;
connectToNet(id: string, hostOrPort: number | string, callback?: () => void): void;
connectToNet(id: string, host?: string, port?: number, callback?: () => void): void;


我可以模拟最后一个,但我没有测试相同的spyOn是否也模拟了其他两个重载。

相关问题