jest mock 看不到它在函数中的 if 语句里面被调用了

jest mock does not see that it has been called inside if statement in function

我正在使用带有 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;
    }

我无法弄清楚的是 expect(testRepoMock.innerTestRepo.create).toHaveBeenCalledTimes(1); 一直报告说 testRepoMock.innerTestRepo.create 从未被调用过,即使我可以通过模拟记录 perms 设置为 {id:2} 并且确实输入了if语句

我什至检查了如果我将 repo.create 从 if 语句中移出作为健全性检查会发生什么,然后测试通过,所以它看起来像 if 语句的范围混淆开玩笑这样它没有意识到已经调用了 create。

调用addValue时需要加上await,否则你的expect行会在函数真正执行前执行

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);
});