开玩笑,预计模拟函数已被调用

Abh*_*ain 1 javascript node.js typescript jestjs nestjs

我正在测试以下服务:

\n\n
import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { extend } from 'lodash';\nimport { Repository } from 'typeorm';\n\nimport { DriverDTO } from './driver.dto';\nimport { DriverEntity } from './driver.entity';\n\n@Injectable()\nexport class DriverService {\n  private logger = new Logger('DriverService');\n  constructor(\n    @InjectRepository(DriverEntity)\n    private driverRepository: Repository<DriverEntity>,\n  ) { }\n\n  async create(clientId: string, data: DriverDTO): Promise<Partial<DriverEntity>> {\n    let driver = await this.driverRepository.findOne({ where: { clientId, driverId: data.driverId } });\n    this.logger.log(driver);\n    if (driver) {\n      throw new HttpException('Driver already exists', HttpStatus.CONFLICT);\n    }\n    driver = this.driverRepository.create(extend({ clientId }, data));\n    await this.driverRepository.save(driver);\n    return { driverId: driver.driverId, createdAt: driver.createdAt };\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

service.spec.ts如下:

\n\n
import { Test, TestingModule } from '@nestjs/testing';\n\nimport { DriverService } from './driver.service';\nimport { MockType } from '../mock/mock.type';\nimport { plainToClass } from 'class-transformer';\nimport { repositoryMockFactory } from '../mock/repositoryMock.factory';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { DriverEntity } from './driver.entity';\nimport { Repository } from 'typeorm';\nimport { Pagination } from '../pagination/pagination';\nimport { HttpException, HttpStatus } from '@nestjs/common';\nimport { DriverDTO } from './driver.dto';\n\ndescribe('DriverService', () => {\n  let service: DriverService;\n  let driverRepositoryMock: MockType<Repository<DriverEntity>>;\n\n  beforeEach(async () => {\n    const module: TestingModule = await Test.createTestingModule({\n      providers: [\n        DriverService,\n        { provide: getRepositoryToken(DriverEntity), useFactory: repositoryMockFactory },\n      ],\n    }).compile();\n\n    service = module.get<DriverService>(DriverService);\n    driverRepositoryMock = module.get(getRepositoryToken(DriverEntity));\n  });\n\n  it('should be defined', () => {\n    expect(service).toBeDefined();\n    expect(driverRepositoryMock).toBeDefined();\n  });\n\n  describe('DriverService.create()', () => {\n    const driverDto: DriverDTO = {\n      driverId: 'one',\n    };\n\n    const driver: DriverEntity = plainToClass(DriverEntity, {\n      id: 1,\n      clientId: 'one',\n      driverId: 'one',\n      createdAt: '2019-02-11T04:11:00.766Z',\n      updatedAt: '2019-02-11T04:11:00.766Z',\n    });\n\n    it('should create driver if it does not already exist', () => {\n      const response: Partial<DriverEntity> = plainToClass(DriverEntity, {\n        driverId: driver.driverId,\n        createdAt: driver.createdAt,\n      });\n\n      driverRepositoryMock.findOne.mockReturnValue(undefined);\n      driverRepositoryMock.create.mockReturnValue(driver);\n      expect(service.create('one', driverDto)).resolves.toEqual(response);\n      expect(driverRepositoryMock.findOne).toHaveBeenCalledTimes(1);\n      expect(driverRepositoryMock.findOne).toHaveBeenCalledWith({ where: { clientId: 'one', driverId: driverDto.driverId } });\n      expect(driverRepositoryMock.create).toHaveBeenCalledTimes(1);\n      expect(driverRepositoryMock.create).toHaveBeenCalledWith({\n        clientId: driver.clientId,\n        driverId: driver.driverId,\n      });\n      expect(driverRepositoryMock.save).toHaveBeenCalledWith(driver);\n    });\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我不断收到以下错误:

\n\n
\xe2\x97\x8f DriverService \xe2\x80\xba DriverService.create() \xe2\x80\xba should create driver if it does not already exist\n\n    expect(jest.fn()).toHaveBeenCalledTimes(1)\n\n    Expected mock function to have been called one time, but it was called zero times.\n\n      237 |       expect(driverRepositoryMock.findOne).toHaveBeenCalledTimes(1);\n      238 |       expect(driverRepositoryMock.findOne).toHaveBeenCalledWith({ where: { clientId: 'one', driverId: driverDto.driverId } });\n    > 239 |       expect(driverRepositoryMock.create).toHaveBeenCalledTimes(1);\n          |                                           ^\n      240 |       expect(driverRepositoryMock.create).toHaveBeenCalledWith({\n      241 |         clientId: driver.clientId,\n      242 |         driverId: driver.driverId,\n\n      at Object.it (driver/driver.service.spec.ts:239:43)\n\nTest Suites: 1 failed, 1 total\nTests:       1 failed, 8 passed, 9 total\nSnapshots:   0 total\nTime:        1.762s, estimated 6s\nRan all test suites matching /src\\/driver\\/driver.service.spec.ts/i.\n
Run Code Online (Sandbox Code Playgroud)\n\n

我这样嘲笑存储库:

\n\n
import { Repository, Entity } from 'typeorm';\nimport { MockType } from './mock.type';\n\n// @ts-ignore\nexport const repositoryMockFactory: () => MockType<Repository<any>> = jest.fn(() => ({\n    findOne: jest.fn(entity => entity),\n    findAndCount: jest.fn(entity => entity),\n    create: jest.fn(entity => entity),\n    save: jest.fn(entity => entity),\n}));\n
Run Code Online (Sandbox Code Playgroud)\n\n

我似乎找不到原因。任何帮助将不胜感激。

\n

Kim*_*ern 5

让您的测试函数异步等待,直到您的服务方法完全执行,然后再检查模拟的期望:

it('should create driver if it does not already exist', async () => {
  //                                                    ^^^^^
  // ...
  await expect(service.create('one', driverDto)).resolves.toEqual(response);
//^^^^^
Run Code Online (Sandbox Code Playgroud)