执行异步的Vue组件在jest测试时等待时挂起

oknwwptz  于 2022-12-08  发布在  Jest
关注(0)|答案(1)|浏览(198)

我正在测试一个在挂载时异步加载数据的组件。组件按预期工作,只是测试出现了问题。组件的async loadData()函数在await axios.get()挂起,而jest测试运行程序在component.vm.$nextTick()中。结果,$nextTick循环中的检查从未通过。
在$nextTick循环超时后,组件的await语句立即完成,组件呈现自己。axios被模拟,所以它应该很快解析。如果我删除await并只填充一个常量,整个过程将按预期执行。
我猜$nextTick循环不是异步的,它正在消耗线程,尽管这是测试异步内容的推荐方法。问题是,我没有onclick异步处理程序等待:此方法从onMount调用。
不幸的是,我不知道如何创建一个jsFiddle,所以我希望这就足够了:
我的组件(相关部件)

  1. export default {
  2. data() { return { content: '' }; },
  3. mounted() { this.loadDoc() }
  4. methods: {
  5. async loadDoc() {
  6. const res = await axios.get('some url'); // <-- this is the line that hangs until timeout
  7. // const res = { data: 'test data'}; // this would test just fine
  8. this.content = res.data;
  9. }
  10. }
  11. }

和我组件规范js:

  1. jest.mock('axios', () => ({
  2. get: async (url) => {
  3. return { data: 'test data' };
  4. }
  5. };
  6. describe('my super test', () => {
  7. it('renders', (done) => {
  8. const doc = shallowMount(myComponent);
  9. doc.vm.$nextTick(() => {
  10. expect(doc.html()).toContain('test data'); // <-- this never matches
  11. done();
  12. });
  13. });
  14. });
4smxwvx5

4smxwvx51#

我会删除,但我只是花了相当多的时间在文件中建议的东西,但没有解释说,这是唯一的方法...我希望别人发现这有用。
使用flush-promises包而不是$nextTick循环立即“修复”了这个问题
代码示例(上述代码的返工):

  1. describe('my super test', () => {
  2. it('renders', async() => {
  3. const doc = shallowMount(myComponent);
  4. await flushPromises();
  5. expect(doc.html()).toContain('test data'); // <-- now it works
  6. });
  7. });

相关问题