A simple and tiny test framework that evaluates synchronous javascript (for now) in the browser
npm i -S chocolatest
import { generateEvaluator, Reporter } from 'chocolatest';
const evaluator = generateEvaluator(new Reporter());
const src = `
//define the function below
const isPrime = (n) => {
return n === 2;
};
`;
const tests = `
test('returns true for prime numbers', () => {
assert(isPrime(2));
assert(isPrime(3));
assert(isPrime(5));
assert(isPrime(7));
assert(isPrime(23));
assert(isPrime(24), 'must fail, 24 not prime');
});
`;
const report = evaluator.run(src, tests);
-
returns true for prime numbers
- Expected: true Actual: false
- Expected: true Actual: false
- Expected: true Actual: false
- Expected: true Actual: false
- Expected: true Actual: false Message: must fail, 24 not prime
The assertion api is best described in one of the two dependencies chocolatest uses.
Browserify's commonjs-assert module
And the method to group assertions is test(name: string, body: () => void)
as you have already seen in the example. Note that you can have more than one call to
test for every run.
interface Report {
testsCount: number;
testsPassed: number;
testsFailed: number;
testsFailedDetails: {
id: number;
name: string;
failures: AssertionEntry[];
}[];
assertsCount: number;
assertsPassed: number;
assertsFailed: AssertionEntry[];
}
interface AssertionEntry {
id: number;
test: number;
expected: any;
actual: any;
message: string;
}
From here you can format the report the way you like and show it to the user.
It leverages on the use of the commonjs-assert module by browserify as long with the
vm-browserify module that allows to
safely execute javascript as a string within a given context and some meta programming using javascript's Proxy object.
You can a look to the src, specifically proxied-assert.ts.
In case you want to know more about proxies and meta programming I deeply recommend Dr. Axel Rauschmayer's post.
MIT © Nico Gallinal