diff --git a/src/adapters/mocha.js b/src/adapters/mocha.js index ad52a57..3bbdcf9 100644 --- a/src/adapters/mocha.js +++ b/src/adapters/mocha.js @@ -41,11 +41,33 @@ function TesteeReporter(runner) { }); pipe('fail', function(data, err) { - var diff = self.diff(data); + var diff; + // Note: this is a workaround until https://github.com/bitovi/testee-client/pull/43 + // can be merged. The associated server PR https://github.com/bitovi/testee/pull/163 + // currently is failing to pass the tests, so #43 cannot be merged. Once that is working + // working, this change should be reverted. --BM 2018-06-06 + var title = data.title; + if(data && data.type === "hook") { + if(data.ctx.currentTest) { + data = data.ctx.currentTest; + } else if(data.title === '"before all" hook') { + // tests in this suite will never run if before() fails, + // so create the first test in order to fail it. + data = data.parent.tests[0]; + diff = self.diff(data); + self.api['test'](diff); + } else { + // after all hook. apply to last test, which has already ran + data = data.parent.tests[data.parent.tests.length - 1]; + } + } + + diff = self.diff(data); diff.err = { message: err.message, stack: err.stack || '' }; + diff.title = title; return diff; }); diff --git a/test/mocha/mocha-errors.html b/test/mocha/mocha-errors.html new file mode 100644 index 0000000..179cc82 --- /dev/null +++ b/test/mocha/mocha-errors.html @@ -0,0 +1,29 @@ + + + + Mocha + + + + +
+ + + + + + + + + diff --git a/test/mocha/test-errors.js b/test/mocha/test-errors.js new file mode 100644 index 0000000..7c11d5b --- /dev/null +++ b/test/mocha/test-errors.js @@ -0,0 +1,36 @@ +describe('mocha', function() { + describe('Errors in setup/teardown', function() { + describe('before', function() { + before(function() { + throw new Error('Test error'); + }) + it('passes', function() { + expect(true).to.equal(true); + }) + }) + describe('beforeEach', function() { + beforeEach(function() { + throw new Error('Test error'); + }) + it('passes', function() { + expect(true).to.equal(true); + }) + }) + describe('afterEach', function() { + afterEach(function() { + throw new Error('Test error'); + }) + it('passes', function() { + expect(true).to.equal(true); + }) + }) + describe('after', function() { + after(function() { + throw new Error('Test error'); + }) + it('passes', function() { + expect(true).to.equal(true); + }) + }) + }) +}); diff --git a/test/mocha/test.js b/test/mocha/test.js index d889d5c..86343fd 100644 --- a/test/mocha/test.js +++ b/test/mocha/test.js @@ -24,5 +24,4 @@ describe('Test module', function() { }); }); }); - }); \ No newline at end of file diff --git a/test/test.js b/test/test.js index c9f8e0a..80c2448 100644 --- a/test/test.js +++ b/test/test.js @@ -567,6 +567,224 @@ unit.test( testTester('mocha/mocha.html', mochaSnapshot) ); +var mochaErrorsSnapshot = [{ + "name": "api/runs::create", + "data": { + "status": "running", + "environment": navigator.userAgent, + "runner": "Mocha", + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "", + "pending": false, + "root": true, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "mocha", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "Errors in setup/teardown", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "before", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::create", + "data": { + "title": "passes", + "sync": true, + "timedOut": false, + //"pending": true, + "type": "test", + //"status": "pending", + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::patch", + "data": { + "status": "failed", + "state": "failed", + "title": "\"before all\" hook", + "err": { + "message": "Test error" + } + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "beforeEach", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::create", + "data": { + "title": "passes", + "sync": true, + "timedOut": false, + "type": "test", + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::patch", + "data": { + "status": "failed", + "state": "failed", + "title": "\"before each\" hook for \"passes\"", + "err": { + "message": "Test error" + } + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "afterEach", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::create", + "data": { + "title": "passes", + "sync": true, + "timedOut": false, + "type": "test", + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::patch", + "data": { + "status": "passed", + "state": "passed" + } +}, { + "name": "api/tests::patch", + "data": { + "status": "failed", + "state": "failed", + "title": "\"after each\" hook for \"passes\"", + "err": { + "message": "Test error" + } + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::create", + "data": { + "status": "running", + "title": "after", + "pending": false, + "root": false, + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::create", + "data": { + "title": "passes", + "sync": true, + "timedOut": false, + "type": "test", + "file": /mocha\/mocha-errors\.html/ + } +}, { + "name": "api/tests::patch", + "data": { + "status": "passed", + "state": "passed" + } +}, { + "name": "api/tests::patch", + "data": { + "status": "failed", + "state": "failed", + "title": "\"after all\" hook", + "err": { + "message": "Test error" + } + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/suites::patch", + "data": { + "status": "finished" + } +}, { + "name": "api/coverages::create", + "data": { + coverage: { + "test": "Mocha coverage" + } + } +}, { + "name": "api/runs::patch", + "data": { + "status": "finished", + "total": 6, + "failed": 4, + "pending": 0, + "passed": 2 + } +}]; +unit.test( + 'runs the Mocha test and errors as appropriate', + testTester('mocha/mocha-errors.html', mochaErrorsSnapshot) +); + var jasmineSnapshot = [{ "name": "api/runs::create", "data": {