Typescript jest mock没有看到它在函数中的if语句中被调用

Typescript jest mock没有看到它在函数中的if语句中被调用,typescript,jestjs,typeorm,Typescript,Jestjs,Typeorm,我将typescript与typeORM一起使用,我有一个jest测试,如下所示: test('add test', async () => { testRepoMock = { innerTestRepo: ({ findOne: jest.fn().mockReturnValue(null), create: jest.fn().mockReturnValue({ id: 2

我将typescript与typeORM一起使用,我有一个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);
    });
test('addtest',async()=>{
testRepoMock={
innerTestRepo:({
findOne:jest.fn().mockReturnValue(null),
create:jest.fn().mockReturnValue({id:2}),
}作为存储库,
};
addvalue(id,testRepoMock);
期望(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;
    }
静态异步addvalue(
身份证号码:,
repos?:{innerTestRepo:Repository},
):承诺{
让回购;
如果(回购){
//如果这是单元测试,基本上使用我们的模拟
repo=repos.innerTestRepo;
}否则{
repo=await SqlDb.getRepository(ValuesModel);
}
设perms=wait repo.findOne({id});
如果(!perms){
perms=repo.create();
烫发={
…烫发,
};
等待回购保存(perms);
}
回烫;
}
我无法理解的是,
expect(testRepoMock.innerTestRepo.create).tohaveencalledtimes(1)
不断报告从未调用过
testRepoMock.innerTestRepo.create
,即使我可以通过mock记录perms设置为
{id:2}
,并且确实输入了if语句


我甚至检查了如果我将repo.create从if语句中移出作为一个健全性检查,然后测试通过了,所以看起来if语句的范围混淆了jest,以至于它没有意识到create已被调用。

调用
addValue
时,需要添加
wait
,否则,将在实际执行函数之前执行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);
});
test('addtest',async()=>{
testRepoMock={
innerTestRepo:({
findOne:jest.fn().mockReturnValue(null),
create:jest.fn().mockReturnValue({id:2}),
}作为存储库,
};
wait TestService.addvalue(id,testRepoMock);
期望(testRepoMock.innerTestRepo.findOne).toHaveBeenCalledTimes(1);
expect(testRepoMock.innerTestRepo.create).toHaveBeenCalledTimes(1);
});

首先,您不应该在生产代码中设置测试条件。其次,什么是orgPermsRepoMock,它与您实际传递到addvalue的testRepoMock有什么关系?@jonrsharpe orgPerms是一个拼写错误,很好,我已经解决了这个问题。如果我理解正确,条件不在测试中,只是我正在测试的函数。
findOne
是异步调用的。这就是为什么您不能同步检查是否调用了后续的
create
。您正在测试的函数中的条件存在就是我提到的问题。测试设置不应渗入生产代码。我想您已经遇到了一个经典问题(这个函数很难测试,因为它创建了自己的协作器)并应用了标准解决方案(因此我们将反转依赖关系并注入协作器来解耦它),但仅针对测试这样做意味着您正在测试的并不是实际在生产中运行的。这就做到了。该死,也许我需要去睡觉了。非常感谢!将create移出if语句会使测试通过,这是否奇怪?每次都会过去,所以这似乎不是一个时间问题。不管怎样,再次感谢。如果您将它移出并放在findOne上方,它将通过,但如果放在后面,我看不出它如何通过。。。。