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