我正在尝试找到一种方法,以在运行cypress单元测试时检查是否已将错误写入控制台。
我知道如何在控制台上记录一些内容
cy.log('log this to the console');
但不是如何检查是否已写入错误。
关于如何从(浏览器)控制台日志中读取错误的任何建议?
注意:可能不是测试的“智能”方法,但有时我使用的js库会“抱怨”并将错误写入浏览器日志。这是为了简化测试。
答案 0 :(得分:7)
这恰好满足了我在控制台中捕获任何错误并声明日志计数所需要的功能。只需在cypress/support/index.js
Cypress.on('window:before:load', (win) => {
cy.spy(win.console, 'error');
cy.spy(win.console, 'warn');
});
afterEach(() => {
cy.window().then((win) => {
expect(win.console.error).to.have.callCount(0);
expect(win.console.warn).to.have.callCount(0);
});
});
答案 1 :(得分:3)
自上次回答以来,已有一些更新。
由于每个cy.visit
都会重新创建窗口,因此赛普拉斯建议将存根作为cy.visit
命令的一部分。
cy.visit('/', {
onBeforeLoad(win) {
cy.stub(win.console, 'log').as('consoleLog')
cy.stub(win.console, 'error').as('consoleError')
}
})
//...
cy.get('@consoleLog').should('be.calledWith', 'Hello World!')
cy.get('@consoleError').should('be.calledOnce')
有关更多详细信息,请参见有关将控制台暂存的官方常见问题解答:https://docs.cypress.io/faq/questions/using-cypress-faq.html#How-do-I-spy-on-console-log
以及配方存储库:https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/stubbing-spying__console
答案 2 :(得分:2)
目前,尚无直接的方法来完成您要问的事情,但已经就如何最好地获取此信息进行了很好的讨论。我在这里复制了一个解决方案,但是如果您遵循github链接,则可以看到提出的其他解决方案。
此摘录摘自此处的github问题:https://github.com/cypress-io/cypress/issues/300
仅供参考,一个简单的解决方案就是监视控制台功能。
cy.window().then((win) => { cy.spy(win.console, "log") })
这将在每次调用该函数时打印命令日志,并且 您还可以断言已记录的内容。
另一个取决于您为什么要断言出问题的选项是在无头模式下通过测试打印错误。工程副总裁创建了一个NPM软件包来为您完成此任务。
答案 3 :(得分:2)
编辑:在无头模式下,以下不会直接登录到终端,但是它在AUT的
console.error
上的测试失败,并显示错误消息甚至在无头终端中也可能是您想要的。
我不确定您的意思是什么,但是让我们仔细研究一下可以在赛普拉斯中记录输出的所有地方以及如何处理几种情况。
要登录命令日志,请使用:
// from inside your test
cy.log('foo');
要登录 devTools控制台:
// from inside your test
console.log('bar');
要登录到终端,您需要从赛普拉斯的节点进程中登录:
// from within e.g. your plugin/index.js file
console.log('baz');
(注意,这里的AUT代表被测应用,表示您的应用)。
我还使用ansicolor
软件包在终端中将错误显示为红色,这是可选的。
// plugins/index.js
const ansi = require(`ansicolor`);
module.exports = ( on ) => {
on(`task`, {
error ( message ) {
// write the error in red color
console.error( ansi.red(message) );
// play `beep` sound for extra purchase
process.stdout.write(`\u0007`);
return null;
}
});
};
注意:使用内部cy.now()
命令可解决赛普拉斯(IMO)不应抛出Cypress detected that you returned a promise
的趋势。
(改编自https://github.com/cypress-io/cypress/issues/300#issuecomment-438176246)
// support/index.js or your test file
Cypress.on(`window:before:load`, win => {
cy.stub( win.console, `error`, msg => {
// log to Terminal
cy.now(`task`, `error`, msg );
// log to Command Log & fail the test
throw new Error( msg );
});
});