Unit Test
install
sh
npm i --save-dev @nestjs/testing
Testing utilities
typescript
import { Test } from "@nestjs/testing";
import { CatsController } from "./cats.controller";
import { CatsService } from "./cats.service";
describe("CatsController", () => {
let catsController: CatsController;
let catsService: CatsService;
beforeEach(async () => {
const moduleRef = await Test.createTestingModule({
controllers: [CatsController],
providers: [CatsService],
}).compile();
catsService = moduleRef.get<CatsService>(CatsService);
catsController = moduleRef.get<CatsController>(CatsController);
});
describe("findAll", () => {
it("should return an array of cats", async () => {
const result = ["test"];
jest.spyOn(catsService, "findAll").mockImplementation(() => result);
expect(await catsController.findAll()).toBe(result);
});
});
});
scope가 transient 또는 request 일떄
typescript
const moduleRef = await Test.createTestingModule({
controllers: [CatsController],
providers: [CatsService],
}).compile();
catsService = await moduleRef.resolve(CatsService);
Auto mocking
sh
npm install --save-dev jest-mock
typescript
import { ModuleMocker, MockFunctionMetadata } from "jest-mock";
const moduleMocker = new ModuleMocker(global);
describe("CatsController", () => {
let controller: CatsController;
beforeEach(async () => {
const moduleRef = await Test.createTestingModule({
controllers: [CatsController],
})
.useMocker((token) => {
const results = ["test1", "test2"];
if (token === CatsService) {
return { findAll: jest.fn().mockResolvedValue(results) };
}
if (typeof token === "function") {
const mockMetadata = moduleMocker.getMetadata(
token
) as MockFunctionMetadata<any, any>;
const Mock = moduleMocker.generateFromMetadata(mockMetadata);
return new Mock();
}
})
.compile();
controller = moduleRef.get(CatsController);
});
});
Overriding globally registered enhancers
typescript
providers: [
{
provide: APP_GUARD,
useExisting: JwtAuthGuard,
// ^^^^^^^^ notice the use of 'useExisting' instead of 'useClass'
},
JwtAuthGuard,
],
// spec.ts
const moduleRef = await Test.createTestingModule({
imports: [AppModule],
})
.overrideProvider(JwtAuthGuard)
.useClass(MockAuthGuard)
.compile();
requset scoped instance
typescript
const contextId = ContextIdFactory.create();
jest
.spyOn(ContextIdFactory, "getByRequest")
.mockImplementation(() => contextId);
catsService = await moduleRef.resolve(CatsService, contextId);