【发布时间】:2021-04-08 20:02:04
【问题描述】:
这是 users.service.ts
@Injectable()
export class UserService {
constructor(
@InjectRepository(User) private readonly users: Repository<User>,
@InjectRepository(Verification)
private readonly verifications: Repository<Verification>,
private readonly jwtService: JwtService,
private readonly mailService: MailService,
) {}
async findById(id: number): Promise<UserProfileOutput> {
try {
const user = await this.users.findOneOrFail({ id });
return {
ok: true,
user: user,
};
} catch (error) {
return { ok: false, error: 'User Not Found' };
}
}
我正在使用 TypeORM 的存储库 API(例如 users.findOne、users.find、users.delete 等)。 而下面的文件是测试“users.service”的测试文件。
这是“users.service.spec.ts”
const mockRepository = () => ({
findOne: jest.fn(),
findOneOrFail: jest.fn(),
save: jest.fn(),
create: jest.fn(),
delete: jest.fn(),
});
const mockJwtService = {
sign: jest.fn(() => 'signed-token'),
verify: jest.fn(),
};
const mockMailService = () => ({
sendVerificationEmail: jest.fn(),
});
type MockRepository<T = any> = Partial<Record<keyof Repository<T>, jest.Mock>>;
describe('UserService', () => {
let service: UserService;
let usersRepository: MockRepository<User>;
let verificationsRepository: MockRepository<Verification>;
let mailService: MailService;
let jwtService: JwtService;
beforeEach(async () => {
const module = await Test.createTestingModule({
providers: [
UserService,
{
provide: getRepositoryToken(User),
useValue: mockRepository(),
},
{
provide: getRepositoryToken(Verification),
useValue: mockRepository(),
},
{
provide: JwtService,
useValue: mockJwtService,
},
{
provide: MailService,
useValue: mockMailService(),
},
],
}).compile();
service = module.get<UserService>(UserService);
mailService = module.get<MailService>(MailService);
jwtService = module.get<JwtService>(JwtService);
usersRepository = module.get(getRepositoryToken(User));
verificationsRepository = module.get(getRepositoryToken(Verification));
});
it('should be defined', () => {
expect(service).toBeDefined();
});
describe('findById', () => {
it('should fail if user is not found', async () => {
usersRepository.findOneOrFail.mockRejectedValue(new Error());
const result = await service.findById(1);
expect(result).toEqual({
ok: false,
error: 'User Not Found',
});
});
it('should find an existing user', async () => {
const findByIdArgs = {
id: 1,
};
usersRepository.findOneOrFail.mockResolvedValue(findByIdArgs);
const result = await service.findById(1);
expect(result).toEqual({
ok: true,
user: findByIdArgs,
});
});
});
如果我改用 TypeORM 的 querybuilder 方法会怎样。
async findByIdWithQueryBuilder(id: number): Promise<UserProfileOutput> {
try {
const user = await this.users
.createQueryBuilder('user')
.where('bundle.id = :id', { id })
.getOneOrFail();
return {
ok: true,
user,
};
} catch (error) {
return { ok: false, error: 'User Not Found' };
}
}
问题是 如何模拟 QueryBuilder 的链接方法?
我试过了
const mockRepository = () => ({
findOne: jest.fn(),
findOneOrFail: jest.fn(),
save: jest.fn(),
create: jest.fn(),
delete: jest.fn(),
createQueryBuilder: jest.fn(() => ({
delete: () => jest.fn().mockReturnThis(),
innerJoinAndSelect: () => jest.fn().mockReturnThis(),
innerJoin: () => jest.fn().mockReturnThis(),
leftJoinAndSelect: () => jest.fn().mockReturnThis(),
leftJoin: () => jest.fn().mockReturnThis(),
from: () => jest.fn().mockReturnThis(),
where: () => jest.fn().mockReturnThis(),
orWhere: () => jest.fn().mockReturnThis(),
andWhere: () => jest.fn().mockReturnThis(),
execute: () => jest.fn().mockReturnThis(),
orderBy: () => jest.fn().mockReturnThis(),
take: () => jest.fn().mockReturnThis(),
skip: () => jest.fn().mockReturnThis(),
getOne: () => jest.fn(),
getMany: () => jest.fn(),
getManyAndCount: () => jest.fn(),
})),
});
我被困在这里...
模拟 QueryBuilder api 的链接方法的正确方法是什么?
【问题讨论】:
标签: node.js postgresql jestjs nestjs typeorm