Jest
Jest is the de‑facto standard for unit testing JavaScript applications. Spectest complements Jest by exercising your running API just like a browser would. Keep your Jest suites for isolated logic and add Spectest for end‑to‑end HTTP verification.
Setup
Install both packages in your project:
npm install --save-dev jest spectest
Create a spectest.config.js
at the project root:
// spectest.config.js
export default {
baseUrl: 'http://localhost:3000',
testDir: './test/api',
filePattern: '\\.spectest\\.',
};
Jest’s own configuration lives in jest.config.js
as usual.
Sample project structure
my-project/
├─ src/
├─ test/
│ ├─ api/ # Spectest suites
│ │ └─ users.spectest.js
│ └─ unit/ # Jest tests
│ └─ users.test.js
├─ jest.config.js
└─ spectest.config.js
Running both toolchains
Add npm scripts to run them separately or together:
{
"scripts": {
"test:unit": "jest",
"test:api": "spectest",
"test": "npm run test:unit && npm run test:api"
}
}
This keeps output from each tool distinct while letting CI execute a single npm test
command.
Invoking Spectest from Jest
If you prefer to launch Spectest inside a Jest test you can spawn the CLI and assert on the exit code:
// api.test.js
import { spawnSync } from 'child_process';
test('API contract', () => {
const result = spawnSync('npx', ['spectest'], { stdio: 'inherit' });
expect(result.status).toBe(0);
});
Sharing utilities
Utility functions and fixtures can be imported by both Jest and Spectest suites. Keep them in a common folder and reference them from your .spectest.js
and .test.js
files.
CI/CD example
A GitHub Actions job might look like:
- uses: actions/checkout@v3
- run: npm ci
- run: npm test
Spectest exits with a non‑zero status on failures so the workflow fails when either Jest or Spectest tests fail.
Migration tips
To migrate existing API tests written in Jest, move the HTTP calls into .spectest.js
suites. Spectest’s declarative format reduces boilerplate and runs faster. Keep pure logic tests in Jest.
Troubleshooting
- TypeScript suites – compile
.ts
files to JavaScript before running Spectest. - Watch mode – Spectest runs to completion each time; use a separate terminal if you rely on
jest --watch
. - Exit codes – ensure your scripts pass through Spectest’s exit code so CI can detect failures.