inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

테스트를 위한 객체 오류와 createQueryBuilder 사용 방법 질문있습니다!

537

dev kim
0

안녕하세요.

제로초님 유닛테스트쪽 강의 듣고 프로젝트에 유닛테스트를 적용시켜보고 있는데요!

2가지에서 많이 막히고 있습니다.

 

  1. 데이터를 변수에 임시로 넣어주고 원하는 결과값 , 즉 toBe 쪽에 변수를 넣어주려고 하는 도중 계속 아래 오류가 발생하고 있습니다. 오류 메세지가 post 유형에는 없고.. hashtag 유형에 있다는 거면 제대로 작성한거 아닌가요..?

질문1.jpg

// 오류내용
Property 'post' is missing in type '{ id: number; postId: number; hashtag: string; createdAt: Date; }' but required in type 'Hashtag'.

import { PostType } from 'src/enum/postType.enum';
import {
  Column,
  CreateDateColumn,
  Entity,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
  OneToMany,
} from 'typeorm';
import { Hashtag } from './hashtag.entity';

@Entity('posts')
export class Post {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column()
  type!: PostType;

  @Column()
  title!: string;
  ... 생략
  @CreateDateColumn({ name: 'created_at' })
  createdAt!: Date;

  @UpdateDateColumn({ name: 'updated_at' })
  updatedAt!: Date;

  @OneToMany(() => Hashtag, (hashtag) => hashtag.post)
  hashtags: Hashtag[];
}

 

import {
  Column,
  CreateDateColumn,
  Entity,
  PrimaryGeneratedColumn,
  ManyToOne,
  JoinColumn,
} from 'typeorm';
import { Post } from './post.entity';

@Entity('hashtags')
export class Hashtag {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column({ name: 'post_id' })
  postId: number;

  @Column()
  hashtag!: string;

  @CreateDateColumn({ name: 'created_at' })
  createdAt!: Date;

  @ManyToOne(() => Post, (post) => post.hashtags)
  @JoinColumn({ name: 'post_id' })
  post: Post;
}

 

 

  1. createQueryBuilder, leftJoinAndSelect, where, getOne 이거를 findOne 처럼 전부 만들어줘야 하는 것인가요..? 아래는 제가 서비스에서 사용했던 레포입니다! (테스트 파일 아닙니다!)

     

this.postRepository
      .createQueryBuilder('posts')
      .leftJoinAndSelect('posts.hashtags', 'hashtags')
      .where('posts.id = :id', { id })
      .getOne();

 

createQueryBuilder를 사용하는 강의가 없어서 검색중에 어떤 글을 발견하고 따라해봤지만 막혀서 질문 드립니다 ..! createQueryBuilder 이걸 사용하기 위해서는 어떤 방식으로 만들어야 하는건가요???

만약 아래처럼 만들었다고 해도 강의에서는 expect 안에 service.함수명 이런식으로 호출하시던데 만약 createQueryBuilder를 사용하게 되면 repository.createQueryBulder().leftAndJoin.... 이런식으로 똑같이 만들어주는건가요..?? 유닛테스트 작업이 처음이라 계속 막히는 것 같습니다...

const MockPostRepository = () => {
  createQueryBuilder: jest.fn().mockReturnValue({
    leftAndJoin: jest.fn().mockReturnThis(),
    where: jest.fn().mockReturnThis(),
    getOne: jest.fn().mockReturnThis(),
  });
};

describe('PostService', () => {
  let postService: PostService;
  let postRepository: MockRepository<Post>;

  beforeEach(async () => {
    // 가짜 모듈 생성
    const module = await Test.createTestingModule({
      providers: [
        PostService,
        // 실제 디비가 아닌 목업 디비로 연결해서 사용하기 위함
        {
          provide: getRepositoryToken(Post),
          useValue: MockPostRepository(),
        },
      ],
    }).compile();

    // 가짜 모듈을 postService 변수에 담아줌
    postService = module.get<PostService>(PostService);
    postRepository = module.get<MockRepository<Post>>(getRepositoryToken(Post));
  });
});

node.js express nestjs typeorm

답변 1

1

제로초(조현영)

  1. post가 필수네요. post?: 로 수정하세요.

  2. 네 그냥 똑같이 메서드 체이닝할 수 있게 만드시면 됩니다. 마지막에 getOne이나 getMany만 모킹값 리턴하면 됩니다.

0

dev kim

빠른 답변 감사합니다!!

2번에 대해서 조금 더 여쭤보고 싶습니다. 3개가 실패했다고 오류뜨는데 이게 getOne, leftJoinAndSelect, where이 제대로 실행이 안되었다고 보는건가요..? post에 조인한 hashtag는 어떤식으로 가져와야 하는건가요..? MockPostRepository 안에 createQueryBuilder안에 전부 leftJoinAndSelect, where, getOne 은 들어가있습니다!

 

image

  • 테스트 코드 작성한 내용

it('getPostWithHasgtagById(): Id 기준으로 Post와 Hashtag를 가져와야함', () => {
    expect(postService.getPostWithHasgtagById(1)).toBe(postWithHashtagObject);
  });
const MockPostRepository = () => ({
  createQueryBuilder: jest.fn().mockReturnValue({
    leftJoinAndSelect: jest.fn().mockReturnThis(),
    where: jest.fn().mockReturnThis(),
    getOne: jest.fn().mockReturnThis(),
  }),
});

 

0

제로초(조현영)

getOne에서 expect한 값을 return해주셔야죠. getPostWithHashtagById가 엉뚱한 걸 return하고있잖아요.

0

dev kim

getOne에서 expect한 값을 리턴한다는게 잘 이해가 되지 않습니다..

0

제로초(조현영)

단적으로 말해서 getOne에서 postWithHashtagObject를 return하시면 됩니다.

0

dev kim

getOne 부분이 getOne: jest.fn().mockReturnThis() 이 부분을 말씀하시는게 맞나요..??

0

제로초(조현영)

네. getOne은 최종 결과물을 return해야지 왜 this를 return하나요

0

dev kim

아아.. 넵 빠른 답변 감사합니다!!

로드맵으로 프론트엔드 전향이 가능할까요?

0

413

1

요즘시장에 MERN스택으로 개발하는 프로젝트가 많이 있는지 궁금합니다.

0

457

1

신규 강의가 비슷하게 나왔던데

0

432

0

다이아그램 자료 안뜨는데요.

0

426

0

업데이트로 인해, Adroid 설정부분이 조금 다릅니다.

1

444

1

질문이 아니라서 여기에 올립니다.

0

381

1

안녕하세요 질문있습니다!

0

413

1

여기 이제 강사님 답변은 볼수없는거에요?

0

472

1

api 연결에 대해서

0

492

1

Frontend도 공부하고 싶은데, NEXT JS 와 Flutter 중 무엇이 나을까요

0

1070

1

방학동안 학습에 대한 질문입니다!!!

0

424

1

보충 강의 감사합니다

0

401

0