jasmine.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. var q = require('q');
  2. var webdriver = require('selenium-webdriver');
  3. var RunnerReporter = function(emitter) {
  4. this.emitter = emitter;
  5. this.testResult = [],
  6. this.failedCount = 0;
  7. };
  8. RunnerReporter.prototype.jasmineStarted = function() {
  9. // Need to initiate startTime here, in case reportSpecStarting is not
  10. // called (e.g. when fit is used)
  11. this.startTime = new Date();
  12. };
  13. RunnerReporter.prototype.specStarted = function() {
  14. this.startTime = new Date();
  15. };
  16. RunnerReporter.prototype.specDone = function(result) {
  17. var specInfo = {
  18. name: result.description,
  19. category: result.fullName.slice(0, -result.description.length).trim()
  20. };
  21. if (result.status == 'passed') {
  22. this.emitter.emit('testPass', specInfo);
  23. } else if (result.status == 'failed') {
  24. this.emitter.emit('testFail', specInfo);
  25. this.failedCount++;
  26. }
  27. var entry = {
  28. description: result.fullName,
  29. assertions: [],
  30. duration: new Date().getTime() - this.startTime.getTime()
  31. };
  32. if (result.failedExpectations.length === 0) {
  33. entry.assertions.push({
  34. passed: true
  35. });
  36. }
  37. result.failedExpectations.forEach(function(item) {
  38. entry.assertions.push({
  39. passed: item.passed,
  40. errorMsg: item.passed ? undefined : item.message,
  41. stackTrace: item.passed ? undefined : item.stack
  42. });
  43. });
  44. this.testResult.push(entry);
  45. };
  46. /**
  47. * Execute the Runner's test cases through Jasmine.
  48. *
  49. * @param {Runner} runner The current Protractor Runner.
  50. * @param {Array} specs Array of Directory Path Strings.
  51. * @return {q.Promise} Promise resolved with the test results
  52. */
  53. exports.run = function(runner, specs) {
  54. var JasmineRunner = require('jasmine');
  55. var jrunner = new JasmineRunner();
  56. /* global jasmine */
  57. require('jasminewd2').init(webdriver.promise.controlFlow(), webdriver);
  58. var jasmineNodeOpts = runner.getConfig().jasmineNodeOpts;
  59. // On timeout, the flow should be reset. This will prevent webdriver tasks
  60. // from overflowing into the next test and causing it to fail or timeout
  61. // as well. This is done in the reporter instead of an afterEach block
  62. // to ensure that it runs after any afterEach() blocks with webdriver tasks
  63. // get to complete first.
  64. var reporter = new RunnerReporter(runner);
  65. jasmine.getEnv().addReporter(reporter);
  66. // Add hooks for afterEach
  67. require('./setupAfterEach').setup(runner, specs);
  68. // Filter specs to run based on jasmineNodeOpts.grep and jasmineNodeOpts.invert.
  69. jasmine.getEnv().specFilter = function(spec) {
  70. var grepMatch = !jasmineNodeOpts ||
  71. !jasmineNodeOpts.grep ||
  72. spec.getFullName().match(new RegExp(jasmineNodeOpts.grep)) != null;
  73. var invertGrep = !!(jasmineNodeOpts && jasmineNodeOpts.invertGrep);
  74. if (grepMatch == invertGrep) {
  75. spec.disable();
  76. }
  77. return true;
  78. };
  79. // Run specs in semi-random order
  80. if (jasmineNodeOpts.random) {
  81. jasmine.getEnv().randomizeTests(true);
  82. // Sets the randomization seed if randomization is turned on
  83. if (jasmineNodeOpts.seed) {
  84. jasmine.getEnv().seed(jasmineNodeOpts.seed);
  85. }
  86. }
  87. return runner.runTestPreparer().then(function() {
  88. return q.promise(function(resolve, reject) {
  89. if (jasmineNodeOpts && jasmineNodeOpts.defaultTimeoutInterval) {
  90. jasmine.DEFAULT_TIMEOUT_INTERVAL = jasmineNodeOpts.defaultTimeoutInterval;
  91. }
  92. var originalOnComplete = runner.getConfig().onComplete;
  93. jrunner.onComplete(function(passed) {
  94. try {
  95. var completed = q();
  96. if (originalOnComplete) {
  97. completed = q(originalOnComplete(passed));
  98. }
  99. completed.then(function() {
  100. resolve({
  101. failedCount: reporter.failedCount,
  102. specResults: reporter.testResult
  103. });
  104. });
  105. } catch (err) {
  106. reject(err);
  107. }
  108. });
  109. jrunner.configureDefaultReporter(jasmineNodeOpts);
  110. jrunner.projectBaseDir = '';
  111. jrunner.specDir = '';
  112. jrunner.addSpecFiles(specs);
  113. jrunner.execute();
  114. });
  115. });
  116. };