json.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'use strict';
  2. /**
  3. * Module dependencies.
  4. */
  5. var Base = require('./base');
  6. /**
  7. * Expose `JSON`.
  8. */
  9. exports = module.exports = JSONReporter;
  10. /**
  11. * Initialize a new `JSON` reporter.
  12. *
  13. * @api public
  14. * @param {Runner} runner
  15. */
  16. function JSONReporter (runner) {
  17. Base.call(this, runner);
  18. var self = this;
  19. var tests = [];
  20. var pending = [];
  21. var failures = [];
  22. var passes = [];
  23. runner.on('test end', function (test) {
  24. tests.push(test);
  25. });
  26. runner.on('pass', function (test) {
  27. passes.push(test);
  28. });
  29. runner.on('fail', function (test) {
  30. failures.push(test);
  31. });
  32. runner.on('pending', function (test) {
  33. pending.push(test);
  34. });
  35. runner.on('end', function () {
  36. var obj = {
  37. stats: self.stats,
  38. tests: tests.map(clean),
  39. pending: pending.map(clean),
  40. failures: failures.map(clean),
  41. passes: passes.map(clean)
  42. };
  43. runner.testResults = obj;
  44. process.stdout.write(JSON.stringify(obj, null, 2));
  45. });
  46. }
  47. /**
  48. * Return a plain-object representation of `test`
  49. * free of cyclic properties etc.
  50. *
  51. * @api private
  52. * @param {Object} test
  53. * @return {Object}
  54. */
  55. function clean (test) {
  56. return {
  57. title: test.title,
  58. fullTitle: test.fullTitle(),
  59. duration: test.duration,
  60. currentRetry: test.currentRetry(),
  61. err: errorJSON(test.err || {})
  62. };
  63. }
  64. /**
  65. * Transform `error` into a JSON object.
  66. *
  67. * @api private
  68. * @param {Error} err
  69. * @return {Object}
  70. */
  71. function errorJSON (err) {
  72. var res = {};
  73. Object.getOwnPropertyNames(err).forEach(function (key) {
  74. res[key] = err[key];
  75. }, err);
  76. return res;
  77. }