0

首先,我不确定这是否是一回事,这是我第一次为 NestJs 编写单元测试。

我正在尝试为在其构造函数中具有以下依赖项的控制器编写一些单元测试:

@Controller('builder/instance')
export class InstanceController {
   private executor: Executor;

   constructor(
    @Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,
    private stripeService: StripeService,
    private instanceService: InstanceService,
    private organizationService: OrganizationService,
    private executorFactory: ExecutorFactory,
    private socketService: SocketService,
    private auditLogService: AuditLogService,
) {
    this.executor = this.executorFactory.getExecutor();
}

这是我的测试套件的开始:

describe('InstanceController', () => {
let controller: InstanceController;

const mockStripeService = {};
const mockInstanceService = {};
const mockOrganizationService = {};
const mockExecutorFactory = {};
const mockSocketService = {};
const mockAuditLogService = {};

beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
        // imports: [AccountModule],
        controllers: [InstanceController],
        providers: [
            StripeService,
            InstanceService,
            OrganizationService,
            ExecutorFactory,
            SocketService,
            AuditLogService,
        ],
    })
        .overrideProvider(StripeService)
        .useValue(mockStripeService)
        .overrideProvider(InstanceService)
        .useValue(mockInstanceService)
        .overrideProvider(OrganizationService)
        .useValue(mockOrganizationService)
        .overrideProvider(ExecutorFactory)
        .useValue(mockExecutorFactory)
        .overrideProvider(SocketService)
        .useValue(mockSocketService)
        .overrideProvider(AuditLogService)
        .useValue(mockAuditLogService)
        .compile();
});

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

以下堆栈跟踪失败:

Cannot find module 'src/winston/winston.constants' from 'account/user/user.service.ts'

Require stack:
  account/user/user.service.ts
  sockets/socket.service.ts
  builder/instance/instance.controller.spec.ts

   5 | import * as argon2 from 'argon2';
   6 | import { JwtService } from '@nestjs/jwt';
>  7 | import { WINSTON_MODULE_PROVIDER } from 'src/winston/winston.constants';
     | ^
   8 | import { Organization } from '../organization/organization.entity';
   9 | import { User } from './user.entity';
  10 | import { ConfigService } from '../../config/config.service';

  at Resolver.resolveModule (../node_modules/jest-resolve/build/resolver.js:324:11)
  at Object.<anonymous> (account/user/user.service.ts:7:1)

从日志中,我假设问题来自提供者 SocketService,它又具有提供者 UserService,而后者又像这样注入了 Winston Logger:

@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger

我尝试将 UserService 添加到我的测试套件中的 providers 数组中,并添加一个没有解决问题的空对象的模拟实现。不知道还能从这里尝试什么,我必须在 mockSocketService 中添加一个模拟提供程序还是必须添加一个模拟记录器?

任何帮助将不胜感激,如果我可以提供更多代码以便于理解,请告诉我。

更新

更改相对路径解决了模拟服务中温斯顿依赖的问题,但现在 Jest 抱怨无法解决控制器中的温斯顿依赖。这是因为它是从另一个模块导出的,但是通过阅读它,我了解到将整个模块导入单元测试是一种不好的做法。我尝试像这样模拟 Logger:

beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
        // imports: [AccountModule],
        controllers: [InstanceController],
        providers: [
            Logger,
        ],
    })
        .overrideProvider(Logger)
        .useValue(mockLogger)
        .compile();
});

但是没有运气,我也尝试过这样嘲弄温斯顿结果也是负面的。

4

1 回答 1

0

解决了

我终于能够弄清楚如何模拟注入的 Winston 记录器。这是完整的代码:

describe('InstanceController', () => {
let controller: InstanceController;

const mockStripeService = {};
const mockInstanceService = {};
const mockOrganizationService = {};
const mockExecutorFactory = {};
const mockSocketService = {};
const mockAuditLogService = {};

beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
        // imports: [AccountModule],
        controllers: [InstanceController],
        providers: [
            { provide: WINSTON_MODULE_PROVIDER, useValue: {} },
            StripeService,
            InstanceService,
            OrganizationService,
            ExecutorFactory,
            SocketService,
            AuditLogService,
        ],
    })
        .overrideProvider(StripeService)
        .useValue(mockStripeService)
        .overrideProvider(InstanceService)
        .useValue(mockInstanceService)
        .overrideProvider(OrganizationService)
        .useValue(mockOrganizationService)
        .overrideProvider(ExecutorFactory)
        .useValue(mockExecutorFactory)
        .overrideProvider(SocketService)
        .useValue(mockSocketService)
        .overrideProvider(AuditLogService)
        .useValue(mockAuditLogService)
        .compile();

    controller = module.get<InstanceController>(InstanceController);
});

it('should be defined', () => {
    expect(controller).toBeDefined();
});
});
于 2022-03-03T23:49:52.807 回答