diff --git a/Nodejs/Product/Nodejs/TestFrameworks/mocha/mocha.js b/Nodejs/Product/Nodejs/TestFrameworks/mocha/mocha.js index 9a6c4cf7f..3a43c57a0 100644 --- a/Nodejs/Product/Nodejs/TestFrameworks/mocha/mocha.js +++ b/Nodejs/Product/Nodejs/TestFrameworks/mocha/mocha.js @@ -2,12 +2,6 @@ var EOL = require('os').EOL; var fs = require('fs'); var path = require('path'); -var result = { - 'title': '', - 'passed': false, - 'stdOut': '', - 'stdErr': '' -}; // Choose 'tap' rather than 'min' or 'xunit'. The reason is that // 'min' produces undisplayable text to stdout and stderr under piped/redirect, // and 'xunit' does not print the stack trace from the test. @@ -22,6 +16,17 @@ function hook_outputs() { process.stdout.write = append_stdout; process.stderr.write = append_stderr; } +function reset_result() { + return { + 'title': '', + 'passed': false, + 'pending': false, + 'stdOut': '', + 'stdErr': '' + }; +} + +var result = reset_result(); hook_outputs(); @@ -142,6 +147,17 @@ var run_tests = function (testCases, callback) { }); }); + runner.on('pending', function (test) { + result.pending = true; + result.title = test.fullTitle(); + post({ + type: 'pending', + title: result.title, + result: result + }); + result = reset_result(); + }); + runner.on('test', function (test) { result.title = test.fullTitle(); post({ @@ -164,12 +180,7 @@ var run_tests = function (testCases, callback) { title: result.title, result: result }); - result = { - 'title': '', - 'passed': false, - 'stdOut': '', - 'stdErr': '' - } + result = reset_result(); }); runner.on('fail', function (test, err) { @@ -179,12 +190,7 @@ var run_tests = function (testCases, callback) { title: result.title, result: result }); - result = { - 'title': '', - 'passed': false, - 'stdOut': '', - 'stdErr': '' - } + result = reset_result(); }); }; diff --git a/Nodejs/Product/TestAdapter/TestExecutor.cs b/Nodejs/Product/TestAdapter/TestExecutor.cs index 1e9c43c18..c42ec1b93 100644 --- a/Nodejs/Product/TestAdapter/TestExecutor.cs +++ b/Nodejs/Product/TestAdapter/TestExecutor.cs @@ -75,18 +75,29 @@ private void ProcessTestRunnerEmit(string line) { var testEvent = JsonConvert.DeserializeObject(line); // Extract test from list of tests - var test = _currentTests.Where(n => n.DisplayName == testEvent.title); - if (test.Count() > 0) + var tests = _currentTests.Where(n => n.DisplayName == testEvent.title); + if (tests.Count() > 0) { - if (testEvent.type == "test start") + switch (testEvent.type) { - _currentResult = new TestResult(test.First()); - _currentResult.StartTime = DateTimeOffset.Now; - _frameworkHandle.RecordStart(test.First()); - } - else if (testEvent.type == "result") - { - RecordEnd(_frameworkHandle, test.First(), _currentResult, testEvent.result); + case "test start": + { + _currentResult = new TestResult(tests.First()); + _currentResult.StartTime = DateTimeOffset.Now; + _frameworkHandle.RecordStart(tests.First()); + } + break; + case "result": + { + RecordEnd(_frameworkHandle, tests.First(), _currentResult, testEvent.result); + } + break; + case "pending": + { + _currentResult = new TestResult(tests.First()); + RecordEnd(_frameworkHandle, tests.First(), _currentResult, testEvent.result); + } + break; } } else if (testEvent.type == "suite end") @@ -354,13 +365,20 @@ private NodejsProjectSettings LoadProjectSettings(string projectFile) }; } - private void RecordEnd(IFrameworkHandle frameworkHandle, TestCase test, TestResult result, ResultObject resultObject) - { - var standardOutputLines = resultObject.stdout.Split('\n'); - var standardErrorLines = resultObject.stderr.Split('\n'); - result.EndTime = DateTimeOffset.Now; - result.Duration = result.EndTime - result.StartTime; - result.Outcome = resultObject.passed ? TestOutcome.Passed : TestOutcome.Failed; + private void RecordEnd(IFrameworkHandle frameworkHandle, TestCase test, TestResult result, ResultObject resultObject) { + String[] standardOutputLines = resultObject.stdout.Split('\n'); + String[] standardErrorLines = resultObject.stderr.Split('\n'); + + if (null != resultObject.pending && (bool)resultObject.pending) + { + result.Outcome = TestOutcome.Skipped; + } + else + { + result.EndTime = DateTimeOffset.Now; + result.Duration = result.EndTime - result.StartTime; + result.Outcome = resultObject.passed ? TestOutcome.Passed : TestOutcome.Failed; + } result.Messages.Add(new TestResultMessage(TestResultMessage.StandardOutCategory, String.Join(Environment.NewLine, standardOutputLines))); result.Messages.Add(new TestResultMessage(TestResultMessage.StandardErrorCategory, String.Join(Environment.NewLine, standardErrorLines))); result.Messages.Add(new TestResultMessage(TestResultMessage.AdditionalInfoCategory, String.Join(Environment.NewLine, standardErrorLines))); @@ -420,11 +438,13 @@ public ResultObject() { title = String.Empty; passed = false; + pending = false; stdout = String.Empty; stderr = String.Empty; } public string title { get; set; } public bool passed { get; set; } + public bool? pending { get; set; } public string stdout { get; set; } public string stderr { get; set; } }