Макет метода в том же классе, который тестируется - PullRequest
18 голосов
/ 26 апреля 2011

Я хочу смоделировать метод в том же классе, который я тестирую.

ClassA {
   function hardToTest($arg) {
      // difficult to test code
   }

   function underTest() {
      return $this->hardToTest('foo');
   }
}

Я думал, что мог бы использовать рефлексию для этого, но, возможно, это просто знак того, что я должен двигатьсяhardToTest в другой объект.

Ответы [ 3 ]

17 голосов
/ 27 апреля 2011

Этот тест будет успешным, если underTest() пройдет 'foo' до hardToTest().Это известно как частичная имитация в документации PHPUnit, потому что вы издеваетесь только над некоторыми методами.

ClassATest {
    function testUnderTest() {
        $mock = $this->getMock('ClassA', ['hardToTest']);
        $mock->expects($this->once())
             ->method('hardToTest')
             ->with('foo');
        $mock->underTest();
    }
}

Я согласен с вашими инстинктами, что эта потребность может быть запахом кода, говорящим вамчто этот класс делает слишком много.

PHPUnit 5.4 +

Поскольку getMock() устарел в 5.4, используйте getMockBuilder() вместо:

$mock = $this->getMockBuilder('ClassA')
             ->setMethods(['hardToTest'])
             ->ge‌​tMock();
1 голос
/ 26 апреля 2011

Что именно является причиной того, что метод трудно проверить?

Если метод защищен, то вы можете просто расширить свой ClassA и сделать hardToTest( $arg ) общедоступным.

Суть в том, что вы не должны изменять класс только потому, что вам нужно написать для него unittest.

0 голосов
/ 27 апреля 2011

Я прибегнул к созданию подкласса моей тестируемой системы с использованием соответствующего метода.

...