jest mock не видит, что он был вызван внутри оператора if в функции - PullRequest
3 голосов
/ 07 августа 2020

Я использую машинописный текст с 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 имеет был вызван.

1 Ответ

2 голосов
/ 07 августа 2020

Вам нужно добавить await при вызове addValue, иначе ваши ожидаемые строки будут выполнены до того, как функции будут фактически выполнены

test('add test', async () => {
    testRepoMock = {
        innerTestRepo: ({
            findOne: jest.fn().mockReturnValue(null),
            create: jest.fn().mockReturnValue({ id: 2 }),
        } as unknown) as Repository<ValuesModel>,
    };

    await TestService.addvalue(id, testRepoMock);

    expect(testRepoMock.innerTestRepo.findOne).toHaveBeenCalledTimes(1);
    expect(testRepoMock.innerTestRepo.create).toHaveBeenCalledTimes(1);
});
...