如何解决处理承诺异常的问题
大家好,我正在尝试使用 Javascript 解决问题陈述,其中有一个简单的按钮可以在 onclick 中将电影添加到收藏夹。如果电影已被添加到收藏夹中,则该函数应抛出 Promise.reject()
。
因此有一些针对此 addFavourite()
的测试用例,并且一些测试用例失败了。你能告诉我为什么吗?我无法更改测试文件,那么我应该更改我的代码以解决错误吗?
这是我的 addFavourite()
函数。 (注意:allMovies 是所有电影对象的列表):
function addFavourite(searchId) {
var favMovie = [];
allMovies.forEach((iterator) => {
if (iterator.id == searchId) {
favMovie = iterator;
}
});
var movieRepeated = false;
allFavourites.forEach((iterator) => {
if (iterator.id == favMovie.id) {
movieRepeated = true;
}
});
if (movieRepeated) {
return Promise.reject(new Error("Movie repeated!")).then(
resolved,rejected
);
} else {
fetch("http://localhost:3000/favourites",{
method: "POST",headers: {
"content-type": "application/json",},body: JSON.stringify(favMovie),})
.then((response) => {
if (response.ok) {
return response.json();
}
})
.then((addedMovie) => {
allFavourites.push(addedMovie);
displayFavs(allFavourites);
return allFavourites;
});
}
}
这些是失败的测试用例:
1.
it('adding of same movie as favourite twice shall be restricted',(done) => {
fetchMock.get('http://localhost:3000/movies',moviesTestData);
fetchMock.get('http://localhost:3000/favourites',favouritesTestData);
fetchMock.post('http://localhost:3000/favourites',moviesTestData[0]);
script.getMovies()
.then(() => {
return script.getFavourites();
})
.then(() => {
return script.addFavourite(476307);
})
.catch((err) => {
expect(err).to.not.equal(null,err);
expect(err.message).to.equal('Movie is already added to favourites');
done();
});
});
it(`addFavourites() shall hit the correct api with correct data and
return correct response`,(done) => {
fetchMock.get('http://localhost:3000/movies',moviesTestData);
fetchMock.get('http://localhost:3000/favourites',favouritesTestData);
fetchMock.post('http://localhost:3000/favourites',moviesTestData[0]);
script.getMovies()
.then(() => {
return script.getFavourites();
})
.then(() => {
return script.addFavourite(476307);
})
.then((res) => {
const lastCallArgs = fetchMock.lastCall();
expect(lastCallArgs[0]).to.equal('http://localhost:3000/favourites');
expect(lastCallArgs[1].method).to.equal('POST');
expect(lastCallArgs[1].body).to.equal(JSON.stringify(moviesTestData[0]));
favouritesTestData.push(moviesTestData[0]);
expect(res).to.deep.equal(favouritesTestData);
expect(document.getElementById('favouritesList').innerHTML)
.to.include('The Unique Lama');
done();
})
.catch((err) => {
expect(err).to.equal(null,err);
done();
});
});
这是我得到的错误:
addFavourites() shall hit the correct api with correct data and return correct response:
Error: Timeout of 2000ms exceeded. For async tests and hooks,ensure "done()" is called; if returning a Promise,ensure it resolves.
at listOnTimeout (internal/timers.js:554:17)
at processtimers (internal/timers.js:497:7)
解决方法
您可能还需要在 done()
主体内调用 then
,因为您没有向测试运行程序返回承诺。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。