Skip to content

A testing meta-framework simplifies unit testing by reducing boilerplate code and enabling developers to build comprehensive and reliable test suites

License

Notifications You must be signed in to change notification settings

suites-dev/suites

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Logo

Suites (formerly Automock)

Suites is a progressive, flexible testing meta-framework aimed at elevating the software testing experience within backend systems working with dependency injection (DI) frameworks.

Suites provides a unified testing experience that combines best practices, industry standards, and a wide range of testing tools to help developers create robust, maintainable, and scalable test suites, thereby ensuring the development of high-quality software.

Codecov Coverage e2e lerna npm downloads npm downloads

↗️ Visit Documentation

Core Features

πŸš€ Zero-Setup Mocking - Automatically generate mock objects, eliminate manual setup, reduce boilerplate code.

πŸ” Type-Safe Mocks - Leverage TypeScript's power with mocks that retain the same type as real objects.

πŸ“„ Consistent Tests Structure - Test suites will follow a consistent syntax and structure, making them easier to read and maintain.

πŸ“ˆ Optimized Performance - By bypassing the actual DI container, unit tests run significantly faster.

🌐 Community & Support - Join a growing community of developers.

πŸ’» Quick Example

Suites suggest an alternative approach to writing unit tests for classes instead of using the traditional mocking libraries and dependency injection frameworks.

Take a look at the following example:

Consider the following UserService and Database classes:

export class Database {
  async getUsers(): Promise<User[]> { ... }
}

export class UserService {
  constructor(private database: Database) {}

  async getAllUsers(): Promise<User[]> {
    return this.database.getUsers();
  }
}

Let's create a unit test for this class:

import { TestBed, Mocked } from '@suites/unit';
import { Database, UserService } from './user.service'; 

describe('User Service Unit Spec', () => {
  let userService: UserService; // πŸ§ͺ Declare the unit under test
  let database: Mocked<Database>; // 🎭 Declare a mocked dependency

  beforeAll(async () => {
    // πŸš€ Create an isolated test env for the unit (under test) + auto generated mock objects
    const { unit, unitRef } = await TestBed.solitary(UserService).compile();

    userService = unit;

    // πŸ” Retreive a dependency (mock) from the unit reference
    database = unitRef.get(Database);
  });

  // βœ… Test test test
  test('should return users from the database', async () => {
    const mockUsers: User[] = [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }];
    database.getUsers.mockResolvedValue(mockUsers);

    const users = await userService.getAllUsers();

    expect(database.getUsers).toHaveBeenCalled();
    expect(users).toEqual(mockUsers);
  });
});

With the use of the TestBed, an instance of the UserService class can be created with mock objects automatically generated for its dependencies. During the test, we have direct access to the automatically generated mock object for the Database dependency (database).

↗️ Quickstart Guide

πŸ“¦ Installation

First, install Suites' unit package:

$ npm i -D @suites/unit

Then, to fully integrate Suites into your mocking and dependency injection frameworks, install the corresponding adapters for your project. For example, to use Suites with Jest and NestJS you would run (alongside the unit package):

$ npm i -D @suites/doubles.jest @suites/di.nestjs

Suites will automatically detect the installed adapters and configure itself accordingly.

Supported DI Frameworks

DI Framework Package Name
NestJS @suites/di.nestjs
Inversify @suites/di.inversify
TSyringe Soon!

Supported Mocking Libraries

DI Framework Package Name
Jest @suites/doubles.jest
Sinon @suites/doubles.sinon
Vitest @suites/doubles.vitest
Bun Soon!
Deno Soon!

πŸ“œ License

Distributed under the Apache (Apache-2.0) License. See LICENSE for more information.