Skip to content

Commit 1394305

Browse files
Merge pull request #8402 from Tony133/test/sample-14-mongoose-base
test(sample-14): added unit test and other improvements
2 parents fb5ee1d + ea25c7d commit 1394305

File tree

7 files changed

+203
-9
lines changed

7 files changed

+203
-9
lines changed

sample/14-mongoose-base/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
### Mongoose base sample
1+
## Mongoose base sample
22

33
### Installation
44

sample/14-mongoose-base/package-lock.json

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sample/14-mongoose-base/package.json

+23-5
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,38 @@
3232
"@nestjs/schematics": "8.0.4",
3333
"@nestjs/testing": "8.1.2",
3434
"@types/express": "4.17.13",
35+
"@types/jest": "27.0.2",
3536
"@types/node": "16.11.6",
3637
"@types/supertest": "2.0.11",
38+
"@typescript-eslint/eslint-plugin": "4.33.0",
39+
"@typescript-eslint/parser": "4.33.0",
40+
"eslint": "7.32.0",
41+
"eslint-config-prettier": "8.3.0",
42+
"eslint-plugin-import": "2.25.2",
3743
"jest": "27.3.1",
3844
"prettier": "2.4.1",
3945
"supertest": "6.1.6",
4046
"ts-jest": "27.0.7",
4147
"ts-loader": "9.2.6",
4248
"ts-node": "10.4.0",
4349
"tsconfig-paths": "3.11.0",
44-
"@typescript-eslint/eslint-plugin": "4.33.0",
45-
"@typescript-eslint/parser": "4.33.0",
46-
"eslint": "7.32.0",
47-
"eslint-config-prettier": "8.3.0",
48-
"eslint-plugin-import": "2.25.2",
4950
"typescript": "4.3.5"
51+
},
52+
"jest": {
53+
"moduleFileExtensions": [
54+
"js",
55+
"json",
56+
"ts"
57+
],
58+
"rootDir": "src",
59+
"testRegex": ".spec.ts$",
60+
"transform": {
61+
"^.+\\.(t|j)s$": "ts-jest"
62+
},
63+
"collectCoverageFrom": [
64+
"**/*.(t|j)s"
65+
],
66+
"coverageDirectory": "../coverage",
67+
"testEnvironment": "node"
5068
}
5169
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { CatsController } from './cats.controller';
3+
import { CreateCatDto } from './dto/create-cat.dto';
4+
import { CatsService } from './cats.service';
5+
6+
describe('CatsController', () => {
7+
let controller: CatsController;
8+
let service: CatsService;
9+
10+
beforeEach(async () => {
11+
const module: TestingModule = await Test.createTestingModule({
12+
controllers: [CatsController],
13+
providers: [
14+
{
15+
provide: CatsService,
16+
useValue: {
17+
findAll: jest.fn().mockResolvedValue([
18+
{
19+
name: 'Cat #1',
20+
breed: 'Bread #1',
21+
age: 4,
22+
},
23+
{
24+
name: 'Cat #2',
25+
breed: 'Breed #2',
26+
age: 3,
27+
},
28+
{
29+
name: 'Cat #3',
30+
breed: 'Breed #3',
31+
age: 2,
32+
},
33+
]),
34+
create: jest
35+
.fn()
36+
.mockImplementation((createCatDto: CreateCatDto) =>
37+
Promise.resolve({ _id: '1', ...createCatDto }),
38+
),
39+
},
40+
},
41+
],
42+
}).compile();
43+
44+
controller = module.get(CatsController);
45+
service = module.get(CatsService);
46+
});
47+
48+
it('should be defined', () => {
49+
expect(controller).toBeDefined();
50+
});
51+
52+
describe('create()', () => {
53+
it('should create a new cat', async () => {
54+
const createCatDto: CreateCatDto = {
55+
name: 'Cat #1',
56+
breed: 'Breed #1',
57+
age: 4,
58+
};
59+
60+
expect(controller.create(createCatDto)).resolves.toEqual({
61+
_id: '1',
62+
...createCatDto,
63+
});
64+
});
65+
});
66+
67+
describe('findAll()', () => {
68+
it('should get an array of cats', () => {
69+
expect(controller.findAll()).resolves.toEqual([
70+
{
71+
name: 'Cat #1',
72+
breed: 'Bread #1',
73+
age: 4,
74+
},
75+
{
76+
name: 'Cat #2',
77+
breed: 'Breed #2',
78+
age: 3,
79+
},
80+
{
81+
name: 'Cat #3',
82+
breed: 'Breed #3',
83+
age: 2,
84+
},
85+
]);
86+
});
87+
});
88+
});

sample/14-mongoose-base/src/cats/cats.controller.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export class CatsController {
99

1010
@Post()
1111
async create(@Body() createCatDto: CreateCatDto) {
12-
this.catsService.create(createCatDto);
12+
return this.catsService.create(createCatDto);
1313
}
1414

1515
@Get()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { CatsService } from './cats.service';
3+
import { Cat } from './interfaces/cat.interface';
4+
import { Model } from 'mongoose';
5+
6+
const mockCat = {
7+
name: 'Cat #1',
8+
breed: 'Breed #1',
9+
age: 4,
10+
};
11+
12+
const catsArray = [
13+
{
14+
name: 'Cat #1',
15+
breed: 'Breed #1',
16+
age: 4,
17+
},
18+
{
19+
name: 'Cat #2',
20+
breed: 'Breed #2',
21+
age: 2,
22+
},
23+
];
24+
25+
describe('CatService', () => {
26+
let service: CatsService;
27+
let model: Model<Cat>;
28+
29+
beforeEach(async () => {
30+
const module: TestingModule = await Test.createTestingModule({
31+
providers: [
32+
CatsService,
33+
{
34+
provide: 'CAT_MODEL',
35+
useValue: {
36+
new: jest.fn().mockResolvedValue(mockCat),
37+
constructor: jest.fn().mockResolvedValue(mockCat),
38+
find: jest.fn(),
39+
create: jest.fn(),
40+
save: jest.fn(),
41+
exec: jest.fn(),
42+
},
43+
},
44+
],
45+
}).compile();
46+
47+
service = module.get(CatsService);
48+
model = module.get<Model<Cat>>('CAT_MODEL');
49+
});
50+
51+
it('should be defined', () => {
52+
expect(service).toBeDefined();
53+
});
54+
55+
it('should return all cats', async () => {
56+
jest.spyOn(model, 'find').mockReturnValue({
57+
exec: jest.fn().mockResolvedValueOnce(catsArray),
58+
} as any);
59+
const cats = await service.findAll();
60+
expect(cats).toEqual(catsArray);
61+
});
62+
63+
it('should insert a new cat', async () => {
64+
jest.spyOn(model, 'create').mockImplementationOnce(() =>
65+
Promise.resolve({
66+
name: 'Cat #1',
67+
breed: 'Breed #1',
68+
age: 4,
69+
}),
70+
);
71+
const newCat = await service.create({
72+
name: 'Cat #1',
73+
breed: 'Breed #1',
74+
age: 4,
75+
});
76+
expect(newCat).toEqual(mockCat);
77+
});
78+
});

sample/14-mongoose-base/src/cats/cats.service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ export class CatsService {
88
constructor(@Inject('CAT_MODEL') private readonly catModel: Model<Cat>) {}
99

1010
async create(createCatDto: CreateCatDto): Promise<Cat> {
11-
const createdCat = new this.catModel(createCatDto);
12-
return createdCat.save();
11+
const createdCat = this.catModel.create(createCatDto);
12+
return createdCat;
1313
}
1414

1515
async findAll(): Promise<Cat[]> {

0 commit comments

Comments
 (0)