Code Smell 82 - 캡슐화를 위반하는 테스트
10343 단어 webdevtutorialprogrammingcodenewbie
TL;DR: Don't write methods with the only purpose of being used in your tests.
문제
솔루션
샘플 코드
잘못된
<?
class Hangman {
private $wordToGuess;
function __construct() {
$this->wordToGuess = getRandomWord();
//Test is not in control of this
}
public function getWordToGuess(): string {
return $this->wordToGuess;
}
}
class HangmanTest extends TestCase {
function test01WordIsGuessed() {
$hangmanGame = new Hangman();
$this->assertEquals('tests', $hangmanGame->wordToGuess());
//how can we make sure the word is guessed?
}
}
오른쪽
<?
class Hangman {
private $wordToGuess;
function __construct(WordRandomizer $wordRandomizer) {
$this->wordToGuess = $wordRandomizer->newRandomWord();
}
}
class MockRandomizer implements WordRandomizer {
function newRandomWord(){
return 'tests';
}
}
class HangmanTest extends TestCase {
function test01WordIsGuessed() {
$hangmanGame = new Hangman(new MockRandomizer());
$this->assertFalse($hangmanGame->wordWasGuessed());
$hangmanGame->play('t');
$this->assertFalse($hangmanGame->wordWasGuessed());
$hangmanGame->play('e');
$this->assertFalse($hangmanGame->wordWasGuessed());
$hangmanGame->play('s');
$this->assertTrue($hangmanGame->wordWasGuessed());
//We just test behavior
}
}
발각
이것은 디자인 냄새입니다.
테스트를 위한 메서드가 필요하다는 것을 감지할 수 있습니다.
태그
<?
class Hangman {
private $wordToGuess;
function __construct() {
$this->wordToGuess = getRandomWord();
//Test is not in control of this
}
public function getWordToGuess(): string {
return $this->wordToGuess;
}
}
class HangmanTest extends TestCase {
function test01WordIsGuessed() {
$hangmanGame = new Hangman();
$this->assertEquals('tests', $hangmanGame->wordToGuess());
//how can we make sure the word is guessed?
}
}
<?
class Hangman {
private $wordToGuess;
function __construct(WordRandomizer $wordRandomizer) {
$this->wordToGuess = $wordRandomizer->newRandomWord();
}
}
class MockRandomizer implements WordRandomizer {
function newRandomWord(){
return 'tests';
}
}
class HangmanTest extends TestCase {
function test01WordIsGuessed() {
$hangmanGame = new Hangman(new MockRandomizer());
$this->assertFalse($hangmanGame->wordWasGuessed());
$hangmanGame->play('t');
$this->assertFalse($hangmanGame->wordWasGuessed());
$hangmanGame->play('e');
$this->assertFalse($hangmanGame->wordWasGuessed());
$hangmanGame->play('s');
$this->assertTrue($hangmanGame->wordWasGuessed());
//We just test behavior
}
}
이것은 디자인 냄새입니다.
테스트를 위한 메서드가 필요하다는 것을 감지할 수 있습니다.
태그
결론
화이트박스 테스트는 깨지기 쉽습니다. 동작 대신 구현을 테스트합니다.
처지
코드 냄새 52 - 깨지기 쉬운 테스트
Maxi Contieri ・ 2021년 1월 4일 ・ 2분 읽기
#codesmell
#tutorial
#codenewbie
#webdev
코드 냄새 28 - 세터
Maxi Contieri ・ 11월 19 '20 ・ 2분 읽기
#oop
#codenewbie
#programming
#webdev
더 많은 정보
코드 냄새 52 - 깨지기 쉬운 테스트
Maxi Contieri ・ 2021년 1월 4일 ・ 2분 읽기
#codesmell
#tutorial
#codenewbie
#webdev
코드 냄새 28 - 세터
Maxi Contieri ・ 11월 19 '20 ・ 2분 읽기
#oop
#codenewbie
#programming
#webdev
더 많은 정보
학점
이 냄새는 @에서 영감을 받았습니다.
로드리고
테스트에 사용되는 유일한 목적으로 메소드를 작성하지 마십시오. 코드가 어떻게 사용되어야 하는지 테스트하십시오. 행맨 게임에서는 비밀 단어를 아는 방법을 노출하지 않습니다. 글자를 추측하거나 놓쳤을 때 게임이 어떻게 작동하는지 테스트합니다.
오후 12:00 - 2021년 6월 24일
Nothing makes a system more flexible than a suite of tests.
로버트 마틴
소프트웨어 엔지니어링 좋은 인용구
Maxi Contieri ・ 12월 28일 '20 ・ 13분 읽기
#codenewbie
#programming
#quotes
#software
이 기사는 CodeSmell 시리즈의 일부입니다.
코드에서 냄새 나는 부분을 찾는 방법
Maxi Contieri ・ 2021년 5월 21일 ・ 4분 읽기
#codenewbie
#tutorial
#codequality
#beginners
Reference
이 문제에 관하여(Code Smell 82 - 캡슐화를 위반하는 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/mcsee/code-smell-82-tests-violating-encapsulation-11je
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Nothing makes a system more flexible than a suite of tests.
소프트웨어 엔지니어링 좋은 인용구
Maxi Contieri ・ 12월 28일 '20 ・ 13분 읽기
#codenewbie
#programming
#quotes
#software
코드에서 냄새 나는 부분을 찾는 방법
Maxi Contieri ・ 2021년 5월 21일 ・ 4분 읽기
#codenewbie
#tutorial
#codequality
#beginners
Reference
이 문제에 관하여(Code Smell 82 - 캡슐화를 위반하는 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mcsee/code-smell-82-tests-violating-encapsulation-11je텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)