javascript 中嵌套异步调用的单元测试

unit testing for a nested async call in javascript

我有两个方法: 第二个被第一个调用,我必须为第一个编写测试。

function func1(props, num) {
    num.value +=1;
    func2(props, num);
}
    
function func2(props, num) {
    props.actions.getItDone().then((res) => {
    num.value+=res.payload;
    console.log(num);//i see 6 here but not in the test result.
    });
}

单元测试文件:

const props = {
    actions: {
        getItDone: () => {
            return Promise.resolve({payload: 5 })
        }
    }
}
it('should verify something', () => {
    const num = {value: 0};
    func1(props, num);
    expect(num.value).toBe(6); // it fails num.value coming here is 1.
});

在我看来,它并没有等待其他方法完成。我怎样才能使这个 return 成为正确的值?

您似乎没有将您在单元测试文件中定义的道具注入到 func2 中。 func2 应该如何知道它应该使用其他文件中的道具?

你应该添加 props 作为参数或者在 func2 获取变量的地方覆盖它们。

您不是在等待 Promise 解决。如果您想知道 func2 中的承诺何时得到解决,则必须将代码修改为 return 承诺,然后等待它们,然后再断言。像这样会解决问题

function func1(props, num) {
  num.value += 1;
  // notice the return
  return func2(props, num);
}

function func2(props, num) {
  // notice the return
  return props.actions.getItDone().then((res) => {
    num.value += res.payload;
  });
}

it("should verify something", async () => {
  const num = { value: 0 };

  await func1(props, num);
  expect(num.value).toBe(6);
});

还要注意测试中async-await的用法。我选择放置它是因为您用 async-await 标记了问题。因此,我认为向您展示如何“等待”功能完成是个好主意。