Testing TypeScript compilation (should succeed or should fail)
-
put
tsconfig.json
into test directory."noEmit"
is recommended.{ "compilerOptions": { "target": "es5", "module": "commonjs", "noEmit": true, "strictNullChecks": true }, "filesGlob": [ "*.ts" ], "exclude": [ "node_modules" ] }
-
put files to be tested into test directory.
// should-succeed.ts interface Foo { foo: string; } export function test(foo: Foo) { console.log(foo.foo); }
When compilation errors should be occurred, write error code inline after 4 slashes(
////
).// should-fail-1.ts interface Foo { foo: string; } export function test(foo: Foo) { console.log(foo.bar); //// TS2339 }
You can write part of error message after error code. (with colon)
// should-fail-2.ts interface Foo { foo: string; } export function test(foo: Foo) { console.log(foo.bar); //// TS2339: Property 'bar' does not exist on }
Or regular expression.
// should-fail-3.ts (but this code is not wrong acturally ...) interface Foo { foo: string; } export function test(foo: Foo) { console.log(foo.foo); //// TS2339: /property .* does not exist/i }
-
run
tsc-test
command$ tsc-test -p test/tsconfig.json
And you will get output like below:
OK: test/should-fail-1.ts OK: test/should-fail-2.ts NG: test/should-fail-3.ts OK: test/should-succeed.ts test/should-fail-3.ts:6 expected: TS2339: /property .* does not exist/i bat was: <no error>
// runner.ts
import test from "ava";
import { Tester, formatFailureMessage } from "tsc-test";
const tester = Tester.fromConfig("<path to tsconfig.json>");
tester.sources.forEach(fileName => {
test(fileName, t => {
const failures = tester.test(fileName);
if (failures.length > 0) {
t.fail(formatFailureMessage(...failures));
}
})
});
MIT