# Testing
# Unit test
# Installation
Ts.ED support officially two unit test frameworks: Jest and Mocha. It's also possible to use your preferred frameworks. Your feedback are welcome
# Usage
Ts.ED provides PlatformTest to create a new context to inject your Services, Controllers, Middlewares, etc... registered with annotations like Injectable .
The process to test any components is the same thing:
- Create a new context for your unit test with
PlatformTest.create
, - Inject or invoke your component with
PlatformTest.inject
orPlatformTest.invoke
, - Reset the context with
PlatformTest.reset
.
Here is an example to test the ParseService:
# Async / Await
Testing asynchronous method is also possible using Promises
(async
/await
):
# Mock dependencies
PlatformTest API provides an invoke
method to create a new instance of your component with mocked dependencies.
TIP
PlatformTest.invoke()
executes automatically the $onInit
hook!
# Test your Rest API
# Installation
To test your API, I recommend you to use the supertest
(opens new window) module.
To install supertest just run these commands:
# Example
WARNING
If you use the PlatformTest, you'll probably get an error when you'll run the unit test:
Platform type is not specified. Have you added at least `import @tsed/platform-express` (or equivalent) on your Server.ts ?
To solve it, just add the import @tsed/platform-express
on your Server.ts
. PlatformTest need this import to know on
which Platform
your server must be executed for integration test.
# Stub a service method
When you're testing your API, you have sometimes to stub a method of a service.
Here is an example to do that:
# Stub a middleware method 6.114.3+
When you're testing your API, you have sometimes to stub middleware to disable authentication for example.
Here is an example to do that:
# Testing session
To install session with Ts.ED see our tutorial.
# Testing with mocked service v7.4.0
One inconvenient with PlatformTest.bootstrap()
and PlatformTest.create()
is that they will always call the hooks of your service like for example $onInit()
.
Note
PlatformTest.create()
call only the $onInit()
hook while PlatformTest.bootstrap()
call all hooks.
This is going to be a problem when you want to test your application, and it uses $onInit
to initialize your database or something else.
Since v7.4.0, You can now mock one or more services as soon as the PlatformTest context is created (like is possible with PlatformTest.invoke
).
Here is an example:
import {MyCtrl} from "../controllers/MyCtrl";
import {DbService} from "../services/DbService";
describe("MyCtrl", () => {
// bootstrap your Server to load all endpoints before run your test
beforeEach(() =>
PlatformTest.create({
imports: [
{
token: DbService,
use: {
getData: () => {
return "test";
}
}
}
]
})
);
afterEach(() => PlatformTest.reset());
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
It's also possible to do that with PlatformTest.bootstrap()
:
import {PlatformTest} from "@tsed/common";
import SuperTest from "supertest";
import {Server} from "../../Server";
describe("SomeIntegrationTestWithDB", () => {
let request: SuperTest.SuperTest<SuperTest.Test>;
beforeAll(
PlatformTest.bootstrap(Server, {
imports: [
{
token: DbService,
use: {
getData: () => {
return "test";
}
}
}
]
})
);
afterAll(PlatformTest.reset);
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Last Updated: 2/5/2023, 1:16:22 PM
Other topics
- Session & cookies
- Passport.js
- Keycloak
- Prisma
- TypeORM
- MikroORM
- Mongoose
- GraphQL
- Socket.io
- Swagger
- AJV
- Multer
- Serve static files
- Templating
- Serverless HTTP
- Seq
- OIDC
- Stripe
- Agenda
- Terminus
- Serverless
- IORedis
- Controllers
- Providers
- Model
- JsonMapper
- Middlewares
- Pipes
- Interceptors
- Authentication
- Hooks
- Exceptions
- Throw HTTP Exceptions
- Cache
- Command
- Response Filter
- Injection scopes
- Custom providers
- Lazy-loading provider
- Custom endpoint decorator
- Testing
- Customize 404