详解Jest结合Vue-test-utils使用的初步实践(14)

如果没有使用MockJS,那么都需要我们提供数据,就需要在afterEach中提供mounted时需要的数据:

beforeEach(() = > {
 jest.restoreAllMocks();
 const mockResult = [{ name: 1}, {name: 2}];
 helper.forData = jest.fn(() = > (Promise.resolve(mockResult)));
 wrapper = shallow(Test7);
});
 

这样处理过后,运行用例通过,并且控制台也不会报错了。

如果是在同一个方法中遇到了需要不同返回结果的forData,比如下面的getQuestion方法:

async getQuestion() {
 const r1 = await forData(axios.get('result1.do'));
 const r2 = await forData(axios.get('result2.do'));
 const res = r1 + r2;
 switch (res) {
  case 2:
   {
    this.result = '222';
    break
   }
  case 3:
   {
    this.result = '333';
    break
   }
 }
},

通过forData发出了两个不同的HTTP请求,返回结果不同,这时我们在测试时就需要使用mockImplementationOnce方法,这个方法mock的函数只被调用一次,多次调用时就会根据定义时的顺序依次调用mock函数,所以测试用例如下:

it('test for getQuestion', async() = > {
 // 设定forData返回值
 const mockFn = jest.fn()
  .mockImplementationOnce(() = > (Promise.resolve(1)))
  .mockImplementationOnce(() = > (Promise.resolve(2)));
 helper.forData = mockFn;
 // 执行
 await wrapper.vm.getQuestion();
 // 断言
 expect(mockFn).toHaveBeenCalledTimes(2);
 expect(wrapper.vm.result).toBe('333')
});

测试用例通过,并且控制台无报错。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持黑区网络。