测试异步 async await JavaScript 函数
Test asynchronous async await JavaScript function
我写了一个异步 JavaScript 函数,但似乎没有得到我期望的返回值。有人可以解释一下我是否误解了异步函数的工作原理,或者我的测试是否不太正确?
下面是我的测试,使用 Nock 模拟了一个服务。
it('Should call async validation function when button is clicked', () => {
const request = nock(/.*/)
.get('/my-service/logincodes/abc123')
.reply(404);
const comp = mount(
<LoginCodeView />
);
expect(comp.instance().doesLoginCodeExist('abc123')).to.equal('Your Login code is not recognized.');
});
以及被测函数:
doesLoginCodeExist = async (loginCode) => {
if (loginCode.match(loginPattern)) {
const response = await MyService.getUserByLoginCode(loginCode);
if (response.code) {
return {};
} else if (response.status === 404) {
return { error: 'Your login code is not recognized.', success: null };
}
return { error: 'Service is temporarily unavailable.', success: null };
}
return null;
};
我已经注销了代码采用的路线,它确实按预期进入了 else if 分支,但是我总是返回一个空对象 {},而不是具有错误和成功属性的对象预期?
一个async
函数总是returns一个Promise
对象。我怀疑这就是你所说的空对象。
作为解决方案,您可以尝试使测试函数 async
并在那里也使用 await
。然后你可以测试 promise 解析到的值。
让我的测试异步等待解决了这个问题。
it('Should call async validation function when button is clicked', async () => {
const request = nock(/.*/)
.get('/my-service/logincodes/abc123')
.reply(404);
const comp = mount(
<LoginCodeView />
);
const returned = await comp.instance().doesLoginCodeExist('abc123')
expect(returned.error).to.equal('Your Login code is not recognized.');
});
我写了一个异步 JavaScript 函数,但似乎没有得到我期望的返回值。有人可以解释一下我是否误解了异步函数的工作原理,或者我的测试是否不太正确?
下面是我的测试,使用 Nock 模拟了一个服务。
it('Should call async validation function when button is clicked', () => {
const request = nock(/.*/)
.get('/my-service/logincodes/abc123')
.reply(404);
const comp = mount(
<LoginCodeView />
);
expect(comp.instance().doesLoginCodeExist('abc123')).to.equal('Your Login code is not recognized.');
});
以及被测函数:
doesLoginCodeExist = async (loginCode) => {
if (loginCode.match(loginPattern)) {
const response = await MyService.getUserByLoginCode(loginCode);
if (response.code) {
return {};
} else if (response.status === 404) {
return { error: 'Your login code is not recognized.', success: null };
}
return { error: 'Service is temporarily unavailable.', success: null };
}
return null;
};
我已经注销了代码采用的路线,它确实按预期进入了 else if 分支,但是我总是返回一个空对象 {},而不是具有错误和成功属性的对象预期?
一个async
函数总是returns一个Promise
对象。我怀疑这就是你所说的空对象。
作为解决方案,您可以尝试使测试函数 async
并在那里也使用 await
。然后你可以测试 promise 解析到的值。
让我的测试异步等待解决了这个问题。
it('Should call async validation function when button is clicked', async () => {
const request = nock(/.*/)
.get('/my-service/logincodes/abc123')
.reply(404);
const comp = mount(
<LoginCodeView />
);
const returned = await comp.instance().doesLoginCodeExist('abc123')
expect(returned.error).to.equal('Your Login code is not recognized.');
});