在express项目中配置Jest时出错

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

我正在尝试为使用express和typescript创建的api创建测试,但在编译和模拟配置中遇到一些奇怪的错误,请按照我的文件操作:

/测试/单元/服务/episodeService.spec.ts

/*some imports*/

describe('Episodes Service', () => {

    let episodesQueryServiceMock: jest.Mocked<typeof episodesQueryService>
    let watchTimeInstance: jest.Mocked<WatchTimeInstance>

    beforeEach(() =>{
        jest.mock('../../../src/services/queries/episodesQueryService')
        jest.mock('../../../src/models/')
        jest.mock('../../../src/models/WatchTime')
        episodesQueryServiceMock =  episodesQueryService as jest.Mocked<typeof episodesQueryService>
    })

    it('When has no watchTime then create it', async ()=> {
        const watchTime: WatchTime =  watchTimeFactory.build() 
        (episodesQueryServiceMock.findByUserIdAndEpisodeId as jest.Mock).mockReturnValue(watchTime)
        (watchTimeInstance.save as jest.Mock).mockReturnValue(watchTime)
        const actual = await episodesService.setWatchTime(watchTime)
    })

})

在此代码中,我的第一行有错误

该表达式不可调用。 类型“WatchTime”没有调用签名.ts(2349)

这行我尝试使用工厂创建一个随机对象来使用factory.ts lib进行测试,请关注我的工厂:

./test/factories/watchTime.ts

/*some imports*/
export const watchTimeFactory = Factory.makeFactory<WatchTime>(() => ({
    userId: Number(faker.random.numeric()),
    episodeId: Number(faker.random.numeric()),
    seconds: Number(faker.random.numeric()),
    createdAt: new Date(),
    updatedAt: new Date()
}))

我以为这是一个库错误,但是我使用两个工厂库(Factory.ts和fishery,都使用大量相同的配置来构建工厂)得到了同样的错误,但是如果我用我的模拟将我的工厂调用从其中取出创建时,错误没有发生,但当我运行测试时,我遇到了另一个错误

TypeError:episodesQueryServiceMock.findByUserIdAndEpisodeId.mockReturnValue不是函数

遵循我的笑话配置

./jest.config.ts

import type {Config} from '@jest/types';
// Sync object
const config: Config.InitialOptions = {
    verbose: true,
    transform: {
        '^.+\\.tsx?$': 'ts-jest',
    },
    setupFiles: ['<rootDir>/test/setup.ts'],
    testEnvironment: 'node',
    maxWorkers: 1,
    preset: 'ts-jest'
};
export default config;

./测试/setup.ts

import dotenv from 'dotenv'
dotenv.config()

process.env.DATABASE = process.env.DATABASE?.replace(/_development/, '_test')

我认为我的错误与配置有关,请帮助我

谢谢你

typescript express unit-testing jestjs ts-jest
1个回答
0
投票

我发现了我的错误,我的代码中有两个问题:

1)我的工厂代码是错误的,正确的代码是:

import * as Factory from "factory.ts";
import { faker } from '@faker-js/faker'
import { WatchTime } from '../../src/models'

export const watchTimeFactory = Factory.makeFactory<WatchTime>({
    userId: Number(faker.random.numeric()),
    episodeId: Number(faker.random.numeric()),
    seconds: Number(faker.random.numeric()),
    createdAt: new Date(),
    updatedAt: new Date()
});

2)我的 jest.mock() 处于错误的上下文中,为了工作,我需要将所有内容都放在相同的上下文中,我的导入情况如何:

import { episodesService } from "../../../src/services/episodesService"
import { episodesQueryService } from "../../../src/services/queries/episodesQueryService"
import { WatchTime } from "../../../src/models/"
import { WatchTimeInstance } from "../../../src/models/WatchTime"
import { watchTimeFactory } from "../../factories/watchTime"

// this place
jest.mock('../../../src/services/queries/episodesQueryService')
jest.mock('../../../src/models/')
jest.mock('../../../src/models/WatchTime')

describe('Episodes Service', () => {

    it('When has no watchTime then create it', async ()=> {
        const watchTime =  watchTimeFactory.build();
        (episodesQueryService.findByUserIdAndEpisodeId as jest.Mock).mockReturnValue(watchTime);
        const actual = await episodesService.setWatchTime(watchTime);
    })

})

这个步骤解决了我的问题,谢谢

© www.soinside.com 2019 - 2024. All rights reserved.