mirror of
https://github.com/cypress-io/cypress.git
synced 2026-05-20 07:09:46 -05:00
driver: properly clone stack traces from error objects, and never display long state traces on backend errors
This commit is contained in:
@@ -2,5 +2,4 @@ Promise = require("bluebird")
|
||||
|
||||
Promise.config({
|
||||
cancellation: true
|
||||
longStackTraces: true
|
||||
})
|
||||
|
||||
@@ -102,15 +102,15 @@ class $Cypress
|
||||
## slice up the behavior
|
||||
config.isInteractive = !config.isTextTerminal
|
||||
|
||||
if not config.isInteractive
|
||||
## disable long stack traces when
|
||||
## we are running headlessly for
|
||||
## performance since users cannot
|
||||
## interact with the stack traces
|
||||
## anyway
|
||||
Promise.config({
|
||||
longStackTraces: false
|
||||
})
|
||||
## enable long stack traces when
|
||||
## we not are running headlessly
|
||||
## for debuggability but disable
|
||||
## them when running headlessly for
|
||||
## performance since users cannot
|
||||
## interact with the stack traces
|
||||
Promise.config({
|
||||
longStackTraces: config.isInteractive
|
||||
})
|
||||
|
||||
{environmentVariables, remote} = config
|
||||
|
||||
@@ -359,7 +359,14 @@ class $Cypress
|
||||
new Promise (resolve, reject) =>
|
||||
fn = (reply) ->
|
||||
if e = reply.error
|
||||
## clone the error object
|
||||
## and set stack cleaned
|
||||
## to prevent bluebird from
|
||||
## attaching long stace traces
|
||||
## which otherwise make this err
|
||||
## unusably long
|
||||
err = $utils.cloneErr(e)
|
||||
err.__stackCleaned__ = true
|
||||
err.backend = true
|
||||
reject(err)
|
||||
else
|
||||
|
||||
@@ -54,11 +54,12 @@ module.exports = {
|
||||
|
||||
return err
|
||||
|
||||
cloneErr: (err) ->
|
||||
err2 = new Error(err.message)
|
||||
err2.name = err.name
|
||||
cloneErr: (obj) ->
|
||||
err2 = new Error(obj.message)
|
||||
err2.name = obj.name
|
||||
err2.stack = obj.stack
|
||||
|
||||
for own prop, val of err
|
||||
for own prop, val of obj
|
||||
if not err2[prop]
|
||||
err2[prop] = val
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
describe "driver/src/cypress/index", ->
|
||||
beforeEach ->
|
||||
@Cypress = Cypress.$Cypress.create({})
|
||||
|
||||
context "#backend", ->
|
||||
it "sets __stackCleaned__ on errors", (done) ->
|
||||
cy.stub(@Cypress, "emit")
|
||||
.withArgs("backend:request")
|
||||
.yieldsAsync({
|
||||
error: {
|
||||
name: "Error"
|
||||
message: "msg"
|
||||
stack: "stack"
|
||||
}
|
||||
})
|
||||
|
||||
@Cypress.backend("foo")
|
||||
.catch (err) ->
|
||||
expect(err.backend).to.be.true
|
||||
expect(err.stack).not.to.include("From previous event")
|
||||
|
||||
done()
|
||||
@@ -1,6 +1,23 @@
|
||||
_ = Cypress._
|
||||
$utils = Cypress.utils
|
||||
|
||||
describe "driver/src/cypress/utils", ->
|
||||
context ".cloneErr", ->
|
||||
it "copies properies, message, stack", ->
|
||||
obj = {
|
||||
stack: "stack"
|
||||
message: "message"
|
||||
name: "Foo"
|
||||
code: 123
|
||||
}
|
||||
|
||||
err = $utils.cloneErr(obj)
|
||||
|
||||
expect(err).to.be.instanceof(top.Error)
|
||||
|
||||
for key, val of obj
|
||||
expect(err[key], "key: #{key}").to.eq(obj[key])
|
||||
|
||||
context ".appendErrMsg", ->
|
||||
it "appends error message", ->
|
||||
err = new Error("foo")
|
||||
|
||||
Reference in New Issue
Block a user