Javascript 如何妥善解决承诺前有玩笑axios模拟等

Javascript 如何妥善解决承诺前有玩笑axios模拟等,javascript,unit-testing,axios,jestjs,Javascript,Unit Testing,Axios,Jestjs,我有这样一个函数: join(): void { this.working.value = true; if (this.info.value) { axios.get('/url') .then((result: ResultStatus) => { this.result = result; }) .catch((reason: AxiosError) => { t

我有这样一个函数:

join(): void {
    this.working.value = true;
    if (this.info.value) {
      axios.get('/url')
        .then((result: ResultStatus) => {
          this.result = result;
        })
        .catch((reason: AxiosError) => {
          this.showError(AjaxParseError(reason));
        })
        .finally(() => {
          this.working.value = false;
        });
    }
  }
我想为此编写一些单元测试。我想写的第一个单元测试是测试“this.saving”是否设置为true,这样我就可以确保我的UI有一个可以用来显示加载指示器的值

但是,当我使用jest模拟axios时,jest会立即解析axios承诺,在调用then/finally块之前,我没有机会测试会发生什么。下面是我的单元测试代码:

import axios from 'axios';
jest.mock('axios');
const mockedAxios = axios as jest.Mocked<typeof axios>;

import successResponse from './__json__/LeagueJoinInfoSuccess.json';

describe('constructor:', () => {
    let vm: classUnderTest;
    beforeEach(() => {
      vm = new classUnderTest();
      mockedAxios.get.mockResolvedValue({ data: successResponse }); // set up the response
      vm.join(); // the function under test
    });
    it('should set working true before calling the server to join', () => {
      expect(vm.working.value).toBeTruthy();
    });
    it('should set working false after calling the server responds', async () => {
      await flushPromises();
      expect(vm.working.value).toBeFalsy();
    });
});
从“axios”导入axios;
开玩笑的模仿(‘axios’);
const mockedAxios=axios作为玩笑。Mocked;
从“./”json“./”LeagueJoinInfoSuccess.json”导入成功响应;
描述('构造函数:',()=>{
让vm:classUnderTest;
在每个之前(()=>{
vm=新类未测试();
mockedAxios.get.mockResolvedValue({data:successResponse});//设置响应
vm.join();//正在测试的函数
});
它('在调用服务器加入之前应将working设置为true',()=>{
expect(vm.working.value).toBeTruthy();
});
它('调用服务器响应后应将工作设置为false',async()=>{
等待flushPromises();
expect(vm.working.value).toBeFalsy();
});
});
第一个expect语句总是false,因为finally块是在我有机会执行wait flushPromises()之前运行的;因此,工作值总是错误的

有没有一个方便的方法让jest对axios的模仿在解决其承诺之前等待


更新:现在有一件非常奇怪的事情:如果我将beforeach的内容移动到每个测试中,那么它的行为方式就是我希望它的行为方式。我想我会在jest上提出一个问题,并询问他们发生了什么事。

我有一个解决方案,您可以创建一个承诺作为响应,但是,我们不会在第一个测试用例中解决它,以保持您的测试加载状态,然后在第二个测试中解决它,如下所示:

description('constructor:',()=>{
让vm:classUnderTest;
//解析函数
让resolveFn:(值?:未知)=>void
在每个之前(()=>{
vm=新类未测试();
常量承诺=新承诺(解析=>{
//按住resolve函数调用第二次测试
resolveFn=解决;
});
mockedAxios.get.mockImplementation(()=>promise);
vm.join();//正在测试的函数
});
它('在调用服务器加入之前应将working设置为true',()=>{
expect(vm.working.value).toBeTruthy();
});
它('调用服务器响应后应将工作设置为false',async()=>{
//解决悬而未决的承诺
决心({
数据:successResponse,
});
//我想你会等承诺兑现
等待新承诺(resolve=>setTimeout(resolve));
expect(vm.working.value).toBeFalsy();
});
});

中的文章解释了这种行为documentation@Teneff我刚刚读了你提到的文件,它根本没有解释发生了什么。里面没有关于如何处理模拟axios承诺的内容。我所看到的是,在before*函数中调用axios调用会自动立即解析承诺,但在测试中调用同一个axios调用并不能立即解析承诺,您必须在测试中使用flushPromises()。是的,我知道这一点,但在测试中调用axios调用会非常麻烦。我希望这不是唯一的解决办法。但我同意这绝对是一个解决办法。你所需要做的就是等待flushPromises(),在那里你可以等待新的承诺()。谢谢你的回答。