单元测试中的坑
官方例子
我们先来看官方给出的测试用例
import { INestApplication } from '@nestjs/common';
import { Test } from '@nestjs/testing';
import * as request from 'supertest';
import { CatsModule } from '../../src/cats/cats.module';
import { CatsService } from '../../src/cats/cats.service';
describe('Cats', () => {
const catsService = { findAll: () => ['test'] };
let app: INestApplication;
beforeAll(async () => {
const module = await Test.createTestingModule({
imports: [CatsModule],
})
.overrideProvider(CatsService)
.useValue(catsService)
.compile();
app = module.createNestApplication();
await app.init();
});
it(`/GET cats`, () => {
return request(app.getHttpServer())
.get('/cats')
.expect(200)
.expect({
data: catsService.findAll(),
});
});
afterAll(async () => {
await app.close();
});
});
这里面有几个坑,稍有不注意可能就掉进去了。首先官方的给出的这个例子,是没有依赖数据库的,还有在引入 CatsService 时,没有依赖原有的,而是 mock 了一个 catsService ,所以后面的测试用例,实在调用这个 catsService 的,而不是 cats 模块中的。
踩坑
我照着官方给出的例子,自己写了一个 demo,唯一与官方不同的是,我的 CatsService 是依赖数据库的,我建立 CatsSchema ,CatsService 中的方法返回的数据都是从数据库中查询出来的。这是我刚开始写的测试用例

本文介绍了在Nest.js中进行单元测试时遇到的坑,特别是当服务依赖数据库时,如何处理这些问题。官方示例未涉及数据库,而实际应用中往往需要考虑。作者尝试单元测试时遇到了数据库连接错误,经过研究了解到单元测试应尽量避免数据库依赖,采用mock策略。最后,作者找到了解决问题的方法,但仍然期待更全面的示例来深入理解Nest.js的单元测试。
最低0.47元/天 解锁文章
580





