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
标记了问题。因此,我认为向您展示如何“等待”功能完成是个好主意。
我有两个方法: 第二个被第一个调用,我必须为第一个编写测试。
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
标记了问题。因此,我认为向您展示如何“等待”功能完成是个好主意。