gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:00:03 24 4
gpt4 key购买 nike

我正在使用带有 typeORM 的 typescript ,我有一个如下所示的 Jest 测试:

    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 语句的范围混淆了 Jest ,以至于它没有意识到该创建已被调用。

最佳答案

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

关于typescript - jest mock 看不到它在函数中的 if 语句里面被调用了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63296783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com