首页 > 解决方案 > 为什么nestjs单元测试在beforeEach而不是beforeAll中创建测试模块?

问题描述

在 nestjs 中,测试文件(来自 cli 的模板)具有Test.createTestingModuleinside beforeEach,因此它在每次测试之前重新创建模块。

例如 foo.service.spec.ts

import { Test, TestingModule } from '@nestjs/testing';
import { FooService } from './foo.service';

describe('FooService', () => {
  let service: FooService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [FooService],
    }).compile();

    service = module.get<FooService>(FooService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });
});

但为什么它在beforeEach而不是在beforeAll

有什么理由让它在beforeEach吗?也许它会引起问题?

我看到在 e2e 测试中,应用程序是在 中创建的beforeAll,所以我不确定为什么单元测试是在beforeEach.

标签: jestjsnestjs

解决方案


我认为这是因为当你想要执行单元测试时通常需要创建模拟和间谍,这在你想要真正的数据库连接等的 E2E 测试中是不正确的。

如果您在 BeforeAll 中定义模块,则需要创建 AfterEach 以清除每个间谍和模拟的历史记录。

也因为 E2E 中的一切都是真实的,如果我们为每个测试重新初始化所有模块和连接确实需要很长时间。


推荐阅读