inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

유닛 테스팅 하기

테스트 DI 관련 질문

1398

강석민

작성한 질문수 2

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 을 따로 해주는 것인지 모르겠습니다.

express nodejs TypeORM NestJS

답변 4

0

달콤한 캥거루

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

0

제로초(조현영)

provide: connection, useClass: class MockConnection {} }

0

달콤한 캥거루

谢谢,已经解决了

0

제로초(조현영)

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

{
provide: getRepositoryToken(ChannelMembersEntity),
useClass: MockChannelMembersRepository,
}, Connection

0

제로초(조현영)

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

0

이준규

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

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

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

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

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

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

 

0

제로초(조현영)

provide: connection, useClass: class MockConnection {}

추가해보세요.

0

이준규

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

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

제로초(조현영)

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

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 파일입니다.

강의자료는 어디서 다운받나요?

0

131

4

질문 있습니다.

0

304

3

코드 편집기 확장 프로그램

0

213

2

(질문)비밀 저장소에 접근하기 위한 인증 정보는 로컬 .env에 저장하는지?

0

153

2

(질문)외부 저장소를 통한 환경변수 불러오기 비동기 질문

0

173

3

로그인을 해도 LoggedInGuard쪽에서 false값이 나옵니다.

0

158

2

로그인방법이 고민됩니다.

0

193

2

yarn seed 명령어 실행 시 데이터 삽입 안됨

0

297

4

yarn run db:create 시에 발생하는 데코레이터 오류

0

244

2

npm run db:create 시에 발생하는 decorating 오류

0

237

2

RxJS 디버깅 질문 있습니다.

0

193

3

CacheManager에 대해 질문 있습니다.

0

181

2

로깅은 어떻게 하는게 효율적일까요?

0

232

1

CORS 질문 있습니다.

0

423

2

쿠키 옵션에 대해서 질문 있습니다.

0

187

2

로그아웃 요청이 403 forbidden 에러가 나는데 왜그런걸까요??

0

452

1

401 unauthorized문제

0

294

1

가드의 장점에 대해서 질문이 있습니다.

0

227

1

로그 관리에 대해 질문 있습니다.

0

253

2

CORS 에러 질문 있습니다.

0

322

2

배포 환경 DB 연결 질문 있습니다.

0

416

2

socket io 미 연결 문제 (nest & flutter)

1

1162

3

no elements in sequence 에러 관해서 질문이 있습니다.

0

459

1

start:dev-backup으로 돌리면 핫 리로딩이 되요 정상인가요?

0

323

1