인프런 커뮤니티 질문&답변

강석민님의 프로필 이미지
강석민

작성한 질문수

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

유닛 테스팅 하기

테스트 DI 관련 질문

작성

·

1.3K

0

안녕하세요 제로초님 강의 잘 보고 많이 배웠습니다!!
항상 좋은 강의 올려주셔서 감사합니다!
 
다름이 아니라 마지막 UsersService 부분에서
 
Error: Nest can't resolve dependencies of the UsersService (UsersEntityRepository, WorkspaceMembersEntityRepository, ChannelMembersEntityRepository, ?). Please make sure that the argument Connection at index [3] is available in the RootTestModule context. Potential solutions: - If Connection is a provider, is it part of the current RootTestModule? - If Connection is exported from a separate @Module, is that module imported within RootTestModule? @Module({ imports: [ /* the Module containing Connection */ ] })
 
다음과 같은 에러가 발생하게 되었습니다.
 
constructor(
@InjectRepository(UsersEntity)
private usersRepository: Repository<UsersEntity>,
@InjectRepository(WorkspaceMembersEntity)
private workspaceMembersRepository: Repository<WorkspaceMembersEntity>,
@InjectRepository(ChannelMembersEntity)
private channelMembersRepository: Repository<ChannelMembersEntity>,
private connection: Connection,
) {}
usersService의 connection 에서 문제가 발생한거 같은데 버전문제인지, Mocking 을 따로 해주는 것인지 모르겠습니다.

답변 4

0

怎么解决的呀?我也遇到了同样的问题

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

provide: connection, useClass: class MockConnection {} }

谢谢,已经解决了

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

test쪽에서 getRepositoryToken(ChannelMembersEntity) 아래에 Connection 추가하시면 됩니다.

{
provide: getRepositoryToken(ChannelMembersEntity),
useClass: MockChannelMembersRepository,
}, Connection
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

Connection을 Mocking 해야할 수도 있습니다.

조현영 선생님 안녕하십니까 선생님 강의를 정말 좋아하고 열심히 듣고있습니다.

하지만 약 4일간 이 질문글과 같은 에러를 해결못하는 중에 있습니다..

현영님의 답변처럼 Connection을 추가하면 

에러가 나오고 이 에러의 해결방법이 말씀하신 Connection을 모킹해야 하는 경우라고 생각은 되지만 방법을 잘 모르겠습니다. . ㅠㅜㅠ

제가 강의들을 때의 코드는 질문자분과 조금 바뀐 상태입니다

오늘날짜기준  zerocho 깃허브의  sleact/nest-typeorm 코드를 그대로 사용중입니다.

 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

provide: connection, useClass: class MockConnection {}

추가해보세요.

에러 해결되었습니다. 감사합니다

0

강석민님의 프로필 이미지
강석민
질문자

import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersEntity } from '../entities/Users.entity';
import { WorkspaceMembersEntity } from '../entities/WorkspaceMembers.entity';
import { ChannelMembersEntity } from '../entities/ChannelMembers.entity';

@Module({
imports: [
TypeOrmModule.forFeature([
UsersEntity,
WorkspaceMembersEntity,
ChannelMembersEntity,
]),
],
providers: [UsersService],
exports: [UsersService],
controllers: [UsersController],
})
export class UsersModule {}

users.module.ts 파일입니다.

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

이 부분은 모듈 부분 보여주시는 게 좋습니다. 테스트쪽과 실제 모듈 모두요

강석민님의 프로필 이미지
강석민
질문자

import { Test, TestingModule } from '@nestjs/testing';
import { UsersService } from './users.service';
import { getRepositoryToken } from '@nestjs/typeorm';
import { UsersEntity } from '../entities/Users.entity';
import { WorkspaceMembersEntity } from '../entities/WorkspaceMembers.entity';
import { ChannelMembersEntity } from '../entities/ChannelMembers.entity';

class MockUserRepository {
#data = [{ id: 2, email: 'test@gmail.com' }];
findOne({ where: { email } }) {
const data = this.#data.find((v) => v.email === email);
if (data) {
return data;
}
return null;
}
}
class MockWorkspaceMembersRepository {}
class MockChannelMembersRepository {}

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

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UsersService,
{
provide: getRepositoryToken(UsersEntity),
useClass: MockUserRepository,
},
{
provide: getRepositoryToken(WorkspaceMembersEntity),
useClass: MockWorkspaceMembersRepository,
},
{
provide: getRepositoryToken(ChannelMembersEntity),
useClass: MockChannelMembersRepository,
},
],
}).compile();

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

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

it('findByEmail은 이메일을 통해 유저를 찾아야 함', () => {
expect(service.findByEmail('test@gmail.com')).resolves.toBe({
email: 'test@gmail.com',
id: 2,
});
});

it('findByEmail은 유저를 못 찾으면 null을 반환해야 함', () => {
expect(service.findByEmail('test@gail.com')).resolves.toBe(null);
});
});

users.service.spec.ts 파일입니다.
강석민님의 프로필 이미지
강석민

작성한 질문수

질문하기