当前位置: 首页 > 知识库问答 >
问题:

用Jest在nestjs中模拟可注入模型

饶承宣
2023-03-14

我想对我的服务进行单元测试。在我的服务中,我有一个构造函数,它是:

ContractService.ts

  export class ContractService {
  private logger = new Logger('ContractService');
  constructor(
    @InjectModel(Contract)
    private contractModel: typeof Contract,
  ) {}

  async getContracts(query: PaginationInterface): Promise<FetchContract> {
    const { limit, page, skip } = paginationParseParams(query);
    const { sortBy, direction } = sortParseParams(query, ColumnDetails);
    const { count, rows } = await this.contractModel.findAndCountAll({
      where: {},
      offset: skip,
      limit: limit,
      order: [[sortBy, direction]],
    });
    const pages = Math.ceil(count / limit);
    const meta = {
      limit,
      skip,
      page,
      count,
      pages,
      sortBy,
      direction,
    };
    return { meta, data: rows };
  }
}

我的模型看起来是这样的:(模型是来自sequelize-typescript的类)

export class Contract extends Model<Contract> {
   .... 
} 

所以我想用JEST创建我的单元测试。当我试图模仿contractModel时,它找不到方法,即使我试图模仿它。

const mockContractModel = () => ({
  findAndCountAll: jest.fn(),
});

describe('ContractService', () => {
  let contractService: ContractService;
  let contractModel: Contract;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        ContractService,
        {
          provide: Contract,
          useFactory: mockContractModel,
        },
      ],
    }).compile();

    contractService = module.get<ContractService>(ContractService);
    contractModel = module.get<Contract>(Contract);
  });

  it('should be defined', () => {
    expect(contractService).toBeDefined();
  });

  describe('Get contracts', () => {
    it('Should return all the contracts', async () => {
      expect(contractModel.findAndCountAll).not.toHaveBeenCalled();
      await contractService.getContracts(defaultPagination);
      expect(contractModel.findAndCountAll).toHaveBeenCalled();
    });
  });
}); 

我在想,怎样才是嘲弄这个合同模型的正确方法。

共有1个答案

龙才俊
2023-03-14

而不是使用

{
  provide: Contract,
  useFactory: mockContractModel
}

你应该用

js prettyprint-override"> {
  provide: getModelToken(Contract),
  useFactory: mockContractModel
}

其中GetModelToken是从@nestjs/mongoose导入的。这将为Nest获取正确的DI令牌,以了解您在嘲笑什么。有关更多示例,请查看此git repo

 类似资料:
  • 问题内容: 我开始认为这是不可能的,但是无论如何我都想问。 我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易- 应用程式码: 和测试代码: 笑话相当于什么?我觉得这是一件很想做的简单的事,但是我一直在努力尝试弄清头发。 我最接近的是将s 替换为s,并将其移入测试/函数中。都不是我想做的事情。 为了获得加分,我希望在其中的功能为默认导出时使整个工作正常进行。但是,我知

  • null 如上所示,它导出了一些命名函数,而且重要的是 使用了 。 开玩笑地说,当我为 编写单元测试时,我希望模拟 函数,因为我不希望 中的错误影响我为 编写的单元测试。我的问题是我不确定最好的方法是: 如有任何帮助/洞察力,我们将不胜感激。

  • 问题内容: 每当我想测试使用资源注入的类时,我最终都会包含一个仅在测试中使用的构造函数: 还有另一种模拟资源注入的方式,或者这是遵循的正确模式吗? 问题答案: 您可以使用简单的光泽效果,它可以模拟EJB注入系统。 另一种方法是在测试中使用反射来设置字段,我有时使用类似这样的内容:

  • 我正在开发一个React应用程序,我想测试一个模块,我们称之为B,这取决于另一个模块,我们称之为a。 场景可能是这样的: 测试我的组件的核心库是Jest和Ezyme。我的目标是测试模块B,但我想单独测试它,所以我想模拟对模块A的依赖。js。 我知道一种方法是注入helperFn作为道具,而不是导入它,这样在测试期间我就可以注入一个模拟函数,但是这个应用程序上有很大的模块,每个模块都有一些依赖关系。

  • 问题内容: 我的测试目标中当前已导入: 并在我的相同测试目标中使用它: 在测试中,我正在做以下模拟尖锐函数的操作: 但我得到: 有没有一种方法可以使用带有Jest的功能模拟所有Sharp模块功能? 问题答案: 您需要像这样模拟它: 首先,您需要返回function而不是对象,因为您需要调用。该函数调用将返回带有键的对象,该键包含另一个函数,依此类推。 要测试每个功能,您需要为每个功能创建一个间谍。

  • 我正在用TypeScript编写Jest测试,我想为如下函数创建一个强类型模拟: 请注意,回调是可选的。如果我用要强制转换模拟函数。。。 ...试着这样使用它: ... 我得到TS错误2345: 类型参数(选项:DownloadOptions,回调:(DownloadId: number)= 参数“callback”和“callback”的类型不兼容。 键入“((下载ID:编号)= 类型“未定义”