在茉莉花测试中嘲笑 process.exit

mocking process.exit in a jasmine test

我的业务逻辑有一个条件,如果某个条件为真,则进程退出。这对于业务逻辑是正确的,但是对这种情况进行单元测试是一个问题,因为当我模拟条件的值时,测试过程本身退出,因此我在最后打印了错误,因为 none 的期望是实际完成。如何在不实际退出进程的情况下模拟 jasmine 中 process.exit 的功能?

为了使问题更清楚,这里有一些示例代码:

// Unit tests:

it('kills process when condition is false', async (done: DoneFn) => {
     let conditionSpy1 = spyOn(conditionApi, 'getConditionValue').and.returnValues(true, true, ..., false);
     let apiSpy1 = spyOn(api, 'method1').and....
     let apiSpy2 = spyOn(api2, 'method2').and...
     await myFunction();
     expect(api.method1).toHaveBeenCalled();
     expect(api2.method2).not.toHaveBeenCalled();
     done();
});
// business logic
async function myFunction() {

     const results = api.method1();
     for (const document of results) {
         const continueProcess = conditionApi.getConditionValue();
         if (!continueProcess) {
             console.log('received quit message. exiting job...');
             process.exit(0);
         }
         doStuff(document);
     }
     api2.method2();
}

我想从 myFunction() 调用 return 返回到单元测试,以便继续进行预期,但由于 process.exit(0) 调用,测试中断完全。

我该如何解决这个问题?

尝试监视 process.exit,这样它什么都不做:

it('kills process when condition is false', async (done: DoneFn) => {
     let conditionSpy1 = spyOn(conditionApi, 'getConditionValue').and.returnValues(true, true, ..., false);
     let apiSpy1 = spyOn(api, 'method1').and....
     let apiSpy2 = spyOn(api2, 'method2').and...
     spyOn(process, 'exit'); // add the line here so process.exit() does nothing but you can see if it has been called
     await myFunction();
     expect(api.method1).toHaveBeenCalled();
     expect(api2.method2).not.toHaveBeenCalled();
     done();
});

向您展示我的方法可能行不通。快速 google 搜索如何在 process.exit returns 上 mock/spy 结果是 Jest 而不是 Jasmine。