Skip to main content

Testing Kit & Assertions

EntityTS provides a comprehensive test toolkit designed to make unit and integration testing lightning fast, isolated, and deterministic.


⚡ Zero-Database Unit Testing (InMemoryContext)​

Spin up a fully functional DbContext backed entirely by memory in under 1 millisecond. No Docker, SQLite files, or external databases required:

import { InMemoryContext } from 'entityts';
import { User } from './entities/User';

describe('UserService', () => {
let context: InMemoryContext;

beforeEach(() => {
context = new InMemoryContext({
entities: [User],
seedData: {
users: [
{ id: 1, name: 'Alice', email: 'alice@example.com', isActive: true },
{ id: 2, name: 'Bob', email: 'bob@example.com', isActive: false },
],
},
});
});

it('filters active users correctly', async () => {
const active = await context.set(User).where('isActive', '=', true).toList();
expect(active).toHaveLength(1);
expect(active[0].name).toBe('Alice');
});

it('supports inserting and inspecting in-memory rows', async () => {
await context.set(User).add({ name: 'Charlie', email: 'charlie@example.com', isActive: true });

// Inspect underlying mock table rows
const rows = context.getTableRows('users');
expect(rows).toHaveLength(3);
});
});

🏭 Test Fixture Factories (FixtureFactory)​

Quickly generate randomized or sequentially numbered mock entities for your tests:

import { FixtureFactory } from 'entityts';
import { User } from './entities/User';

const UserFactory = FixtureFactory.define(User, seq => ({
name: `User ${seq}`,
email: `user${seq}@company.org`,
isActive: true,
createdAt: new Date(),
}));

// Build an in-memory instance
const mockUser = UserFactory.build({ name: 'Custom Name' });

// Build a list of 5 mock instances
const mockUsers = UserFactory.buildList(5);

// Build and persist directly to your test DbContext
const savedUser = await UserFactory.create(context, { isActive: false });
const savedUsers = await UserFactory.createList(context, 10);

🔍 SQL Statement Assertions (SqlAssertions)​

Verify the exact SQL output and parameter bindings generated by your queries:

import { SqlAssertions } from 'entityts';

const query = db.users
.where('status', '=', 'active')
.where('age', '>=', 21)
.orderBy(u => u.name, 'asc');

// Assert SQL structure (whitespace-normalized)
SqlAssertions.assert(query).toSQL(
'SELECT * FROM "users" WHERE "status" = $1 AND "age" >= $2 ORDER BY "name" ASC',
);

// Assert SQL contains specific fragments
SqlAssertions.assert(query).toContainSQL('WHERE "status" = $1');

// Assert parameter bindings
SqlAssertions.assert(query).withParams('active', 21).havingParamCount(2);