【问题标题】:how to mock different values for same function jest?如何模拟相同函数笑话的不同值?
【发布时间】:2021-03-04 21:43:54
【问题描述】:

我有一个函数,我将时间范围作为输入并从我的数据库中获取 2 行。我需要获取给定范围内第一个和最后一个数据条目之间的字段差异。

我的功能

async getUsage(start: Date, id: number) {
    const initial = await this.datarepo
      .createQueryBuilder('data')
      .where('data.deviceId = :id and data.RTC > :start')
      .setParameter('id', id)
      .setParameter('start', start)
      .orderBy('data.RTC', 'ASC')
      .getOne();

    const final = await this.datarepo
      .createQueryBuilder('data')
      .where('data.deviceId = :id and data.RTC > :start')
      .setParameter('id', id)
      .setParameter('start', start)
      .orderBy('data.RTC', 'DESC')
      .getOne();

    if (!final) return 0;
    const usage = final.reading- initial.reading;
    return usage;
  }

当我尝试模拟该函数时,即使我使用 mockResolvedValueOnce(),每次调用都会获得相同的数据

beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        DataService,
        {
          provide: getRepositoryToken(dataentity),
          useValue: {
            create: jest.fn(),
            save: jest.fn(),
          },
        },
      ],
    }).compile();

    service = module.get<DataService>(DataService);
    datarepo= module.get(getRepositoryToken(dataentity));
  });

it('gives the difference between energy readings for the given time range', async () => {
    datarepo.createQueryBuilder = jest.fn(() => ({
      where: jest.fn().mockReturnThis(),
      setParameter: jest.fn().mockReturnThis(),
      orderBy: jest.fn().mockReturnThis(),
      getOne: jest
        .fn()
        .mockResolvedValueOnce(usageStart)
        .mockResolvedValueOnce(usageEnd),
    }));
    const result = await service.getUsage(new Date('2021-03-01T11:57:00.000Z'), 981);
    expect(result).toEqual(5);
  });
const usageStart = {
  reading: 70,
  RTC: '2021-03-01T11:57:45.000Z',

};

const usageEnd = {
  reading: 75,
  RTC: '2021-03-01T12:57:45.000Z',
};

我应该得到 5 作为结果,但我得到 0

 expect(received).toEqual(expected) // deep equality

    Expected: 5
    Received: 0

【问题讨论】:

  • 你是如何初始化datarepo的?你是导入还是使用依赖注入?
  • 更新了代码以包含 datarepo 的初始化方式

标签: typescript jestjs mocking nestjs ts-jest


【解决方案1】:

你将datarepo.createQueryBuilder模拟为一个函数,该函数将返回一个带有一些模拟函数的对象,包括getOne函数。

您调用this.datarepo.createQueryBuilder 两次,它将返回对象的2 个不同实例。然后,getOne 函数总是返回第一个模拟值 - usageStart,因为它再也不会被调用。

让我们创建一个模拟对象,然后模拟datarepo.createQueryBuilder 将返回该对象:

      const queryBuilderMock = {
        where: jest.fn().mockReturnThis(),
        setParameter: jest.fn().mockReturnThis(),
        orderBy: jest.fn().mockReturnThis(),
        getOne: jest
          .fn()
          .mockResolvedValueOnce(usageStart)
          .mockResolvedValueOnce(usageEnd),
      }
      
      datarepo.createQueryBuilder = jest.fn(() => queryBuilderMock);

如您所见,datarepo.createQueryBuilder 总是返回 queryBuilderMock 对象。

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2020-06-13
    • 2019-07-15
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多