mirror of
https://github.com/Microsoft/vscode
synced 2024-10-06 03:17:00 +00:00
6a847ba6d1
* eng: add support for snapshot tests This adds Jest-like support for snapshot testing. Developers can do something like: ```js await assertSnapshot(myComplexObject) ``` The first time this is run, the snapshot expectation file is written to a `__snapshots__` directory beside the test file. Subsequent runs will compare the object to the snapshot, and fail if it doesn't match. You can see an example of this in the test for snapshots themselves! After a successful run, any unused snapshots are cleaned up. On a failed run, a gitignored `.actual` snapshot file is created beside the snapshot for easy processing and inspection. Shortly I will do some integration with the selfhost test extension to allow developers to easily update snapshots from the vscode UI. For #189680 cc @ulugbekna @hediet * fix async stacktraces getting clobbered * random fixes * comment out leak detector, for now * add option to snapshot file extension
58 lines
1.8 KiB
JavaScript
58 lines
1.8 KiB
JavaScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
const { constants } = require('mocha/lib/runner');
|
|
const BaseRunner = require('mocha/lib/reporters/base');
|
|
|
|
const {
|
|
EVENT_TEST_BEGIN,
|
|
EVENT_TEST_PASS,
|
|
EVENT_TEST_FAIL,
|
|
EVENT_RUN_BEGIN,
|
|
EVENT_RUN_END,
|
|
} = constants;
|
|
|
|
/**
|
|
* Similar to the mocha JSON stream, but includes additional information
|
|
* on failure. Specifically, the mocha json-stream does not include unmangled
|
|
* expected versus actual results.
|
|
*
|
|
* Writes a superset of the data that json-stream normally would.
|
|
*/
|
|
module.exports = class FullJsonStreamReporter extends BaseRunner {
|
|
constructor(runner, options) {
|
|
super(runner, options);
|
|
|
|
const total = runner.total;
|
|
runner.once(EVENT_RUN_BEGIN, () => writeEvent(['start', { total }]));
|
|
runner.once(EVENT_RUN_END, () => writeEvent(['end', this.stats]));
|
|
|
|
runner.on(EVENT_TEST_BEGIN, test => writeEvent(['testStart', clean(test)]));
|
|
runner.on(EVENT_TEST_PASS, test => writeEvent(['pass', clean(test)]));
|
|
runner.on(EVENT_TEST_FAIL, (test, err) => {
|
|
test = clean(test);
|
|
test.actual = err.actual;
|
|
test.expected = err.expected;
|
|
test.actualJSON = err.actualJSON;
|
|
test.expectedJSON = err.expectedJSON;
|
|
test.snapshotPath = err.snapshotPath;
|
|
test.err = err.message;
|
|
test.stack = err.stack || null;
|
|
writeEvent(['fail', test]);
|
|
});
|
|
}
|
|
};
|
|
|
|
function writeEvent(event) {
|
|
process.stdout.write(JSON.stringify(event) + '\n');
|
|
}
|
|
|
|
const clean = test => ({
|
|
title: test.title,
|
|
fullTitle: test.fullTitle(),
|
|
duration: test.duration,
|
|
currentRetry: test.currentRetry()
|
|
});
|