A lightweight testing framework for JavaScript. (Note: Still under development)
You do not need to import describe, test, expect, or hooks in each test file—they are available as globals, just like in Jest!
Create a test file (e.g., example.test.js):
describe('Math',()=>{beforeAll(()=>{// setup code});beforeEach(()=>{// per-test setup});test('adds numbers',()=>{expect(1+2).toBe(3);});test('object equality',()=>{expect({a: 1,b: 2}).toEqual({a: 1,b: 2});});afterEach(()=>{// per-test teardown});afterAll(()=>{// teardown code});});Use the CLI to run your tests:
npx fauji --dir ./tests --pattern test.js --name math --watch--diror-d: Test directory (default: current directory)--patternor-p: Test file pattern (default:test.js)--nameor-n: Filter test files by name--watchor-w: Watch mode (reruns tests on file changes)
A matcher is a method that lets you test values. The following matchers are available:
expect(5).toBe(5);expect([1,2,3]).toContain(2);expect({foo: 'bar'}).toHaveProperty('foo','bar');expect(()=>{thrownewError('fail');}).toThrow();You can add your own matchers:
addMatchers({toBeDivisibleBy(received,expected){returnreceived%expected===0;}});expect(10).toBeDivisibleBy(2);Fauji provides a Jest-like fake timers API for controlling time-based code in your tests. This is useful for testing code that uses setTimeout, setInterval, or Date.
describe('timer tests',()=>{beforeEach(()=>useFakeTimers());afterEach(()=>useRealTimers());test('setTimeout call count',()=>{setTimeout(()=>{},100);setTimeout(()=>{},200);expect(getTimerCallCount('setTimeout')).toBe(2);expect(getTimerCalls('setTimeout')[0][1]).toBe(100);});});const{ spy, stub, mock, fn }=require('fauji');test('spy on function',()=>{constadd=(a,b)=>a+b;constaddSpy=spy(add);addSpy(1,2);expect(addSpy.calls.length).toBe(1);expect(addSpy.calls[0]).toEqual([1,2]);});test('stub method',()=>{constobj={foo: ()=>1};constfooStub=stub(obj,'foo',()=>42);expect(obj.foo()).toBe(42);fooStub.restore();});