json.js 1.5 KB

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