我正在尝试为使用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')
我认为我的错误与配置有关,请帮助我
谢谢你
我发现了我的错误,我的代码中有两个问题:
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);
})
})
这个步骤解决了我的问题,谢谢