What is @nestjs/testing?
The @nestjs/testing package provides a set of utilities designed to help with the testing of NestJS applications. It simplifies the process of setting up a testing environment, allowing developers to focus on writing their tests. This package is specifically tailored for NestJS, making it easier to test modules, services, controllers, and other components within a NestJS application.
What are @nestjs/testing's main functionalities?
Unit Testing Controllers
This example demonstrates how to set up a unit test for a controller in NestJS using the @nestjs/testing package. It shows the creation of a testing module, mocking dependencies, and asserting the controller's existence.
import { Test, TestingModule } from '@nestjs/testing';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
describe('CatsController', () => {
let controller: CatsController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [CatsController],
providers: [{ provide: CatsService, useValue: {} }],
}).compile();
controller = module.get<CatsController>(CatsController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});
Integration Testing
This code snippet illustrates how to perform an integration test on a NestJS application. It involves setting up the entire application within the test environment and using the 'supertest' package to make HTTP requests to test the application's endpoints.
import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
import { AppModule } from './../src/app.module';
describe('Cats', () => {
let app: INestApplication;
beforeAll(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = moduleFixture.createNestApplication();
await app.init();
});
it('/GET cats', () => {
return request(app.getHttpServer())
.get('/cats')
.expect(200)
.expect('This action returns all cats');
});
});
Other packages similar to @nestjs/testing
jest
Jest is a delightful JavaScript Testing Framework with a focus on simplicity. It works with projects using: Babel, TypeScript, Node, React, Angular, Vue, and more. Jest is often used in combination with NestJS for unit and integration testing, similar to @nestjs/testing, but it is more general-purpose and not specifically tailored to NestJS.
mocha
Mocha is a feature-rich JavaScript test framework running on Node.js and in the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. It is another alternative to @nestjs/testing for writing tests in a NestJS application, but it requires more setup and configuration to integrate smoothly with NestJS.
chai
Chai is a BDD / TDD assertion library for node and the browser that can be delightfully paired with any javascript testing framework. It's often used alongside Mocha or Jest to provide more expressive assertions. While not a testing framework itself, it complements packages like @nestjs/testing by offering a rich set of assertions that can be used in tests.
Modern, powerful web application framework for Node.js.
Description
Nest is a powerful web framework for Node.js, which helps you effortlessly build efficient, scalable applications. It uses modern JavaScript, is built with TypeScript and combines best concepts of both OOP (Object Oriented Progamming) and FP (Functional Programming).
It is not another framework. You don't have to wait for a large community, because Nest is built with awesome, popular well-known libraries - Express and socket.io (you can use any other library if you want to)! It means, that you could quickly start using framework without worrying about a third party plugins.
Installation
Git:
$ git clone https://github.com/kamilmysliwiec/nest-typescript-starter.git project
$ cd project
$ npm install
$ npm run start
NPM:
$ npm i --save @nestjs/core @nestjs/common @nestjs/microservices @nestjs/websockets @nestjs/testing reflect-metadata rxjs
Philosophy
JavaScript is awesome. This language is no longer just a trash to create simple animations in the browser. Now, the front end world is rich in variety of tools. We have a lot of amazing frameworks / libraries such as Angular, React or Vue, which improves our development process and makes our applications fast and flexible.
Node.js gave us a possibility to use this language also on the server side. There are a lot of superb libraries, helpers and tools for node, but non of them do not solve the main problem - the architecture.
We want to create scalable, loosely coupled and easy to maintain applications. Let's show the entire world node.js potential together!
Features
- Easy to learn - syntax is similar to Angular
- Built on top of TypeScript, but also compatible with plain ES6 (I strongly recommend to use TypeScript)
- Based on well-known libraries (Express / socket.io) so you could share your experience
- Supremely useful Dependency Injection, built-in Inversion of Control container
- Hierarchical injector - increase abstraction in your application by creating reusable, loosely coupled modules with type injection
- WebSockets module (based on socket.io, although you can use any other library using adapter)
- Own modularity system (split your system into reusable modules)
- Reactive microservices support with messages patterns (built-in transport via TCP / Redis, but you can use any other type of communication using
CustomTransportStrategy
) - Exceptions handler layer, exception filters, sync & async pipes layer
- Testing utilities
Documentation & Quick Start
Documentation & Tutorial
Starter repos
Useful references
People
Backers
I am on a mission to provide an architecture to create truly flexible, scalable and loosely coupled systems using Node.js platform. It takes a lot of time, so if you want to support me, let's become a backer / sponsor. I'll appreciate each help. Thanks!
License
MIT