Code Smell 82 - 캡슐화를 위반하는 테스트

개체가 잘 작동하고 비즈니스 목표를 달성합니다. 그러나 우리는 그것들을 시험할 필요가 있습니다. 부수자.

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
        }
    }
    

    발각



    이것은 디자인 냄새입니다.

    테스트를 위한 메서드가 필요하다는 것을 감지할 수 있습니다.

    태그


  • 정보 숨기기

  • 결론



    화이트박스 테스트는 깨지기 쉽습니다. 동작 대신 구현을 테스트합니다.

    처지











    더 많은 정보


  • Should I Test Private Methods

  • 학점



    이 냄새는 @에서 영감을 받았습니다.









    로드리고









    테스트에 사용되는 유일한 목적으로 메소드를 작성하지 마십시오. 코드가 어떻게 사용되어야 하는지 테스트하십시오. 행맨 게임에서는 비밀 단어를 아는 방법을 노출하지 않습니다. 글자를 추측하거나 놓쳤을 때 게임이 어떻게 작동하는지 테스트합니다.


    오후 12:00 - 2021년 6월 24일











    Nothing makes a system more flexible than a suite of tests.



    로버트 마틴






    이 기사는 CodeSmell 시리즈의 일부입니다.


    좋은 웹페이지 즐겨찾기