[자바스크립트 코드로 ⌜테스트 주도 개발 시작하기⌟ 2.2.7] 여섯 번째 테스트

Jerry·2023년 8월 26일

TDD

목록 보기
10/34
post-thumbnail

여섯 번째 테스트: 길이가 8글자 이상인 조건만 충족하는 경우

이제 남은 것은 한 가지 조건만 충족하거나 모든 조건을 충족하지 않는 경우이다. 이 중에서 먼저 길이가 8글자 이상인 조건만 충족하는 경우를 진행해보자. 이 경우 암호 강도는 약함이다.


[리스트 2.22] 길이가 8글자 이상인 조건만 충족하는 경우를 검증하기 위한 테스트 코드

const PasswordStrengthMeter = require("./PasswordStrengthMeter");
const PasswordStrength = require("./PasswordStrength");

describe("PasswordStrengthMeterTest", () => {
  // ...생략
  
  test("길이가 8글자 이상인 조건만 충족하면 암호 강도는 약함", () => {
    assertStrength("abdefghi", PasswordStrength.WEAK);
  });
});

PasswordStrength 열거 타입에 WEAK 값을 추가하자.

const PasswordStrength = {
  INVALID: "INVALID",
  STRONG: "STRONG",
  NORMAL: "NORMAL",
  WEAK: "WEAK",
};
Object.freeze(PasswordStrength);

module.exports = PasswordStrength;

const PasswordStrength = require("./PasswordStrength");

class PasswordStrengthMeter {
  meter(s) {
    if (s === null || s === "") return PasswordStrength.INVALID;
    const lengthEnough = s.length >= 8; // 수정 부분
    if (!lengthEnough) return PasswordStrength.NORMAL; // 수정 부분
    const containsNum = this.#meetsContainingNumberCreiteria(s);
    if (!containsNum) return PasswordStrength.NORMAL;
    const containsUpp = this.#meetsContainingUppercaseCreiteria(s);
    if (!containsUpp) return PasswordStrength.NORMAL;
    return PasswordStrength.STRONG;
  }

  // ...생략
}

module.exports = PasswordStrengthMeter;
const PasswordStrength = require("./PasswordStrength");

class PasswordStrengthMeter {
  meter(s) {
    if (s === null || s === "") return PasswordStrength.INVALID;
    const lengthEnough = s.length >= 8;
    const containsNum = this.#meetsContainingNumberCreiteria(s);
    const containsUpp = this.#meetsContainingUppercaseCreiteria(s);
    // if 절을 아래로 이동
    if (!lengthEnough) return PasswordStrength.NORMAL;
    if (!containsNum) return PasswordStrength.NORMAL;
    if (!containsUpp) return PasswordStrength.NORMAL;
    return PasswordStrength.STRONG;
  }

  // ...생략
}

module.exports = PasswordStrengthMeter;

if절 위치를 이동한 이유는 다음 두 로직을 구분해서 모으기 위함이다

  • 개별 규칙을 검사하는 로직
  • 규칙을 검사한 결과에 따라 암호 강도를 계산하는 로직

[리스트 2.23] 길이가 8 이상인 조건만 충족하는 경우를 통과시키기 위한 코드 추가

const PasswordStrength = require("./PasswordStrength");

class PasswordStrengthMeter {
  meter(s) {
    if (s === null || s === "") return PasswordStrength.INVALID;
    const lengthEnough = s.length >= 8;
    const containsNum = this.#meetsContainingNumberCreiteria(s);
    const containsUpp = this.#meetsContainingUppercaseCreiteria(s);

    if (lengthEnough && !containsNum && !containsUpp)
      return PasswordStrength.WEAK; // 추가 부분

    if (!lengthEnough) return PasswordStrength.NORMAL;
    if (!containsNum) return PasswordStrength.NORMAL;
    if (!containsUpp) return PasswordStrength.NORMAL;
    return PasswordStrength.STRONG;
  }

  // ...생략
}

module.exports = PasswordStrengthMeter;

이 글은 아래 책을 토대로 작성된 글입니다.
최범균, ⌜테스트 주도 개발 시작하기⌟, 가메, 2020

책의 예제는 자바로 작성되어 있어 자바스크립트로 작성된 코드를 보여주는 것이 이 글의 목적이기 때문에 많은 설명들이 빠져 있습니다.

💡 책과 함께 코드를 보는 것을 추천드립니다.

profile
I'm jerry

0개의 댓글