Jest SpyOn 选择正确的重载

问题描述 投票:0回答:2

我确实有一个有 2 个重载方法的类。

  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
来模拟第一个方法,但是笑话只看到返回
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> {
reactjs typescript jestjs sequelize.js
2个回答
9
投票

我知道这个问题很老了,但下面是我对任何面临同样问题但可能偶然发现它的人的回答。

目前无法指示

spyOn
应使用哪个重载签名。一种解决方案是将值转换为
spyOn
期望的值。

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

但是,我个人更喜欢尽可能避免强制打字系统。另一种不需要任何打字柔道的解决方法是模拟整个方法实现。

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

0
投票

由于您似乎无法选择要模拟哪个重载,因此在您的情况下可以使用扩展运算符来模拟具有该名称的任何函数。我设法使用

connectToNet
库中的
node-ipc
来做到这一点,该库有一些重载。就我而言,我想执行回调函数。

import NodeIPC from "node-ipc";

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

connectToNet.mockImplementation((...args) => {
  const callback = (args as any)[3];
  if (callback) {
    callback();
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.