Mocha + Chai + Puppeteer 测试响应挂起测试
Mocha + Chai + Puppeteer Testing Response Hangs The Tests
it('Successfully Fetch Numbers',async(done)=>{
page.on('response', response => {
if (response.url().endsWith("allspecialnumbers"))
{
try {
expect(response.status()).to.equal(200);
done();
}catch (err){
console.log(err);
done(err)
}
}
})
await page.$eval('#getsmsspecialnumbers_btn', el => el.click());
});
此测试挂起代码,并且在控制台上测试以红色突出显示,没有任何错误消息。
我正在使用 chai、mocha 和 puppeteer
编辑:
我安慰了this.currentTest
afterEach(function(){
if (this.currentTest.state !== 'passed'){
console.log("Faied",this.currentTest)
}
})
我错了
err: <ref *3> Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.
错误 Resolution method is overspecified. Specify a callback *or* return a Promise; not both.
来自 Mocha。原因是你的测试
it('Successfully Fetch Numbers',async(done)=>{
既是一个异步函数(它总是 returns 一个 Promise),也接受 done
回调。你应该选择其中之一。
例如,如果您选择回调样式,您可以只删除 async
和 await
(并可能添加 .catch(done)
以确保任何承诺拒绝都转换为回调)。
谢谢帕西。您的回答有助于解决我发布的问题。但是在完成任务之前,我遇到了许多其他问题。所以我在这里和那里调整了我的代码,下面是我完成工作的最终代码。
responseEventHandlerWrapper(page,done,urlEndsWith,checkError,ExpectThis) {
return async function responseEventHandler(response) {
if (response.url().endsWith(urlEndsWith))
{
try {
let result = await response.json();
(ExpectThis.constructor.name == 'AsyncFunction')?
await ExpectThis(checkError ? result.error : result.payload):
ExpectThis(checkError ? result.error : result.payload);
page.removeListener('response',responseEventHandler);
done();
}
catch (err){
page.removeListener('response',responseEventHandler);
done(err)
}
}
};
}
然后在我的测试中
it('(Login Successful', (done) => {
let urlEndsWith = "login";
//Steps For Login Process Are Performed Here
page.on('response', responseEventHandlerWrapper(
page,
done,
urlEndsWith,
true,
async (error)=> {
expect(error).to.be.oneOf([null]);
}
));
});
it('Successfully Fetch Numbers',async(done)=>{
page.on('response', response => {
if (response.url().endsWith("allspecialnumbers"))
{
try {
expect(response.status()).to.equal(200);
done();
}catch (err){
console.log(err);
done(err)
}
}
})
await page.$eval('#getsmsspecialnumbers_btn', el => el.click());
});
此测试挂起代码,并且在控制台上测试以红色突出显示,没有任何错误消息。 我正在使用 chai、mocha 和 puppeteer 编辑: 我安慰了this.currentTest
afterEach(function(){
if (this.currentTest.state !== 'passed'){
console.log("Faied",this.currentTest)
}
})
我错了
err: <ref *3> Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.
错误 Resolution method is overspecified. Specify a callback *or* return a Promise; not both.
来自 Mocha。原因是你的测试
it('Successfully Fetch Numbers',async(done)=>{
既是一个异步函数(它总是 returns 一个 Promise),也接受 done
回调。你应该选择其中之一。
例如,如果您选择回调样式,您可以只删除 async
和 await
(并可能添加 .catch(done)
以确保任何承诺拒绝都转换为回调)。
谢谢帕西。您的回答有助于解决我发布的问题。但是在完成任务之前,我遇到了许多其他问题。所以我在这里和那里调整了我的代码,下面是我完成工作的最终代码。
responseEventHandlerWrapper(page,done,urlEndsWith,checkError,ExpectThis) {
return async function responseEventHandler(response) {
if (response.url().endsWith(urlEndsWith))
{
try {
let result = await response.json();
(ExpectThis.constructor.name == 'AsyncFunction')?
await ExpectThis(checkError ? result.error : result.payload):
ExpectThis(checkError ? result.error : result.payload);
page.removeListener('response',responseEventHandler);
done();
}
catch (err){
page.removeListener('response',responseEventHandler);
done(err)
}
}
};
}
然后在我的测试中
it('(Login Successful', (done) => {
let urlEndsWith = "login";
//Steps For Login Process Are Performed Here
page.on('response', responseEventHandlerWrapper(
page,
done,
urlEndsWith,
true,
async (error)=> {
expect(error).to.be.oneOf([null]);
}
));
});