해당 포스트는 CodeStates 과정중의 내용을 복습하며 정리한 것입니다.
이번 과제에서는 TDD에 대해 기초적인 내용을 작성해보는 시간이였다.
과제를 통해 테스트 없이 바닥부터 함수를 작성해서 console.log
를 통해 테스트해보고,
이후 라이브러리를 통해 테스트하는 코드를 작성했다.
detectNetwork 함수는 어떠한 카드 번호를 입력받았을 때 그 카드 번호에 해당하는 카드 회사의 이름을 return 하는 함수다.
주어진 조건이 다음과 같기 때문에 조건문을 사용해서 작성했다.
- 'Diner's Club' 카드 번호는 항상 38이나 39로 시작을하고, 14 자리 숫자
- 'American Express' 카드 번호는 항상 34 나 37로 시작하고, 15 자리 숫자
function detectNetwork(cardNumber) {
let test = cardNumber.slice(0,2)
if((test === '38'||'39')&&(cardNumber.length===14)){
return `Diner's Club`;
} if((test === '34'||'37')&&(cardNumber.length===15)){
return 'American Express';
}
}
그 다음으로
- 'Visa' 카드 번호는 항상 4로 시작을하고, 14이나 16이나 19자리 숫자
- 'MasterCard' 카드 번호는 항상 51~55로 시작하고, 16자리 숫자
if ((test[0] === '4') && (cardNumber.length === 13 || cardNumber.length === 16 || cardNumber.length === 19)) {
return 'Visa';
}
if ((test === '51' || test === '52' || test === '53' || test === '54' || test === '55') && (cardNumber.length === 16)) {
return 'MasterCard';
}
Discover
- 'Discover' 카드 번호는 항상 6011이나 65나 644~649로 시작을하고, 16이나 19자리 숫자
if ((testDiscover === '6011' || test === '65' || Discovers >= 644 || Discovers <= 649) && (cardNumber.length === 16 || cardNumber.length === 19)) {
return "Discover"
}
과제에서는 mocha라는 테스트 프레임워크와 chai라는 라이브러리를 사용했다.
describe("Introduction to Mocha Tests - READ ME FIRST", function () {
// Mocha 테스트는 그저 다음 기능을 하는 도구!
// - 함수를 실행할 때 오류가 발생하면, 실패
// - 오류가 발생하지 않으면, 실패하지 않음.
// 우리는 테스트에서 예상 동작과 실제 동작을 비교하기를 원한다.
// 예상 동작이 실제 동작과 다르다면, 테스트는 실패해야 한다.
it("예상 동작이 실제 동작과 일치하지 않을 때 오류가 발생합니다.", function () {
let even = function (num) {
return num % 2 === 0; // <- 잘 못된 계산식 수정함.
};
if (even(10) !== true) {
throw new Error("10은 짝수여야 합니다!");
}
});
});
/*
detectNetwork.js파일과 현재 파일을 수정해 모든 테스트가 통과하도록 만들어보세요.
*/
describe("Diner's Club", function () {
it("has a prefix of 38 and a length of 14", function () {
if (detectNetwork("38345678901234") !== "Diner's Club") {
throw new Error("Test failed");
}
});
it("has a prefix of 39 and a length of 14", function () {
if (detectNetwork("3934567890123") !== "Diner's Club") {
}
});
});
describe("American Express", function () {
let assert = function (isTrue) {
if (!isTrue) {
throw new Error("Test failed");
}
};
it("has a prefix of 34 and a length of 15", function () {
assert(detectNetwork("343456789012345") === "American Express");
});
it("has a prefix of 37 and a length of 15", function () {
assert(detectNetwork("373456789012345") === "American Express");
});
});
describe("Visa", function () {
let assert = chai.assert;
it("has a prefix of 4 and a length of 13", function () {
assert(detectNetwork("4123456789012") === "Visa");
});
it("has a prefix of 4 and a length of 16", function () {
assert(detectNetwork("4123456789012345") === "Visa");
});
it("has a prefix of 4 and a length of 19", function () {
assert(detectNetwork("4123456789012345678") === "Visa");
});
});
describe("MasterCard", function () {
let expect = chai.expect;
it("has a prefix of 51 and a length of 16", function () {
should.equal(detectNetwork("5112345678901234"), "MasterCard");
});
it("has a prefix of 52 and a length of 16", function () {
should.equal(detectNetwork("5212345678901234"), "MasterCard");
});
it("has a prefix of 53 and a length of 16", function () {
should.equal(detectNetwork("5312345678901234"), "MasterCard");
});
// 스타일의 일관성을 유지하기 위해 should.equal로 통잃
let should = chai.should();
it("has a prefix of 54 and a length of 16", function () {
should.equal(detectNetwork("5412345678901234"), "MasterCard");
});
it("has a prefix of 55 and a length of 16", function () {
should.equal(detectNetwork("5512345678901234"), "MasterCard");
});
});
describe("Discover", function () {
let should = chai.should();
it("has a prefix of 6011 and a length of 16", function () {
should.equal(detectNetwork('6011123456789012'), "Discover");
});
it('has a prefix of 6011 and a length of 19', function () {
should.equal(detectNetwork('6011123456789012345'), "Discover");
});
it('has a prefix of 65 and a length of 16', function () {
should.equal(detectNetwork('6512345678901234'), 'Discover');
});
it('has a prefix of 65 and a length of 19', function () {
should.equal(detectNetwork('6512345678901234567'), 'Discover');
});
for (let i = 644; i <= 649; i++) {
it('has a prefix of ' + i + ' and a length of 16', function () {
should.equal(detectNetwork(i.toString() + '1234567890123'), 'Discover');
});
it('has a prefix of ' + i + ' and a length of 19', function () {
should.equal(detectNetwork(i.toString() + '1234567890123456'), 'Discover');
});
}
});