Я использую машинописный текст с typeORM, и у меня есть тест-шутка, который выглядит следующим образом:
test('add test', async () => {
testRepoMock = {
innerTestRepo: ({
findOne: jest.fn().mockReturnValue(null),
create: jest.fn().mockReturnValue({ id: 2 }),
} as unknown) as Repository<ValuesModel>,
};
TestService.addvalue(id, testRepoMock);
expect(testRepoMock.innerTestRepo.findOne).toHaveBeenCalledTimes(1);
expect(testRepoMock.innerTestRepo.create).toHaveBeenCalledTimes(1);
});
Тестируемая мной функция выглядит так:
static async addvalue(
id: number,
repos?: { innerTestRepo: Repository<ValuesModel> },
): Promise<Values> {
let repo;
if (repos) {
// basically use our mocks if this is a unit test
repo = repos.innerTestRepo;
} else {
repo = await SqlDb.getRepository(ValuesModel);
}
let perms = await repo.findOne({ id });
if (!perms) {
perms = repo.create();
perms = {
...perms,
};
await repo.save(perms);
}
return perms;
}
What I не могу понять, это то, что expect(testRepoMock.innerTestRepo.create).toHaveBeenCalledTimes(1);
продолжает сообщать, что testRepoMock.innerTestRepo.create
никогда не вызывался, хотя я могу зарегистрировать, что perms установлено на {id:2}
через макет и что оператор if действительно введен.
Я даже проверил, что произошло, если я переместил repo.create из этого оператора if в качестве проверки работоспособности, а затем тест прошел, поэтому похоже, что что-то в области действия оператора if сбивает с толку шутку, так что он не понимает, что create имеет был вызван.