TDD(3) beforeEach vs before

kaitlin_k·2022년 4월 11일
0

TDD

목록 보기
3/4

테스트 코드를 작성하면서 beforeEach와 before으로 인해 테스트 케이스에 통과하지 않는 문제가 자주 발생했다. 여러 차례의 삽질을 거듭하면서 beforeEach와 before를 사용하는 경우를 구분해보았다.

beforeEach

beforeEach는 describe 블록 내에 모든 테스트케이스가 동작하기 직전에 실행된다. 여기서 중요한 점은 "모든" 테스트케이스 "직전"에 실행된다는 점이다. 따라서 주로 데이터베이스에 더미 데이터를 추가해야하는 경우에 beforeEach를 사용했다.

describe("Set up Database", () => {
  const users = [
    {
      userId: "test1",
      password: "helloworld123!",
      nickname: "test1_nickname",
    },
    {
      userId: "test2",
      password: "helloworld123!",
      nickname: "test2_nickname",
    },
    {
      userId: "test3",
      password: "helloworld123!",
      nickname: "test3_nickname",
    },
    {
      userId: "test7",
      password: "helloworld123!",
      nickname: "test7_nickname",
    },
  ];
  
  beforeEach("setting middleware", () => {
    app.use(express.json());
    app.use(express.urlencoded({ extended: true }));
    app.use(cookieParser());
  });
  
  beforeEach("sync DB", (done) => {
    models.sequelize.sync({ force: true }).then(() => { done(); });
  });
  
  for (const user of users) {
    beforeEach("insert data", (done) => {
      request(app).post("/users").send(user).end(done);
    });
  }
  // 이하 생략
}        

before

before는 beforeEach보다 뒤에 작성되었다고 하더라도 같은 describe 블록 내에 쓰였다면 describe 바로 다음에 1회만 실행된다. 하나의 describe 블록에서 beforeEach를 먼저 쓰고, before를 다음에 쓰더라도 before가 먼저 1회만 실행된다. 따라서 before는 api 요청을 보내서 반환받은 res의 body를 변수에 저장하거나 statusCode 등을 저장할 때 사용했다.

describe("POST /users 회원가입", () => {
  const user = {
    userId: "test4",
    password: "helloworld123!",
    nickname: "test4_nickname".
  };
  let body;
  let statusCode;
  before("create new user", (done) => {
    request(app)
    .post("/users")
    .send(user)
    .end((err, res) => {
      body = res.body;
      statusCode = res.status;
      done();
    });
  });
  describe("성공시", () => {
    it("creatHashedPassword 함수를 통해 비밀번호는 암호화되어 저장되어야한다", () => {
      body.isCreated.should.be.true();
    });
    
    it("회원가입 성공시 201을 반환한다", () => {
      statusCode.should.equal(201, statusCode);
    });
    
    // 이하 생략
  });
});  
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글