PHPUnit Test Сколько раз вызывается функция - PullRequest
3 голосов
/ 28 сентября 2010

Я работаю над тестом в phpunit и столкнулся с проблемой. В моем классе есть публичная функция, которую я пытаюсь проверить. В зависимости от параметров, переданных в метод, защищенная функция также в моем тестовом классе будет вызываться один или два раза. В настоящее время у меня есть тест для проверки правильности возвращаемых данных, но я также хотел бы убедиться, что защищенный метод вызывается правильное количество раз.

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

ExampleClass

public function do_stuff($runTwice){
$results = do_cool_stuff();
  if($runTwice){
    $results = 2 * do_cool_stuff();
  }
  return $results;
}

protected function do_cool_stuff()
{
  return 2;
} 

В моем тесте я хочу проверить, вызывался ли do_cool_stuff () один или два раза, но я все же хочу, чтобы возвращаемые значения обеих функций были одинаковыми, поэтому я могу также проверить их в своем модульном тесте.

ТЛ; др Я хочу подсчитать, сколько раз вызывается защищенный метод в моем тестовом объекте (как вы можете сделать с фиктивным объектом), но я все еще хочу, чтобы все методы в моем тестовом методе возвращали свои нормальные значения (не как фиктивный объект) .

Ответы [ 2 ]

4 голосов
/ 12 февраля 2011

Либо вернитесь к собственному тестируемому заменителю.Следующее не очень красиво, но вы понимаете:

class ExampleClass {
    public function do_stuff($runTwice) {
        $results = $this->do_cool_stuff();
        if ($runTwice) {
            $results = 2 * $this->do_cool_stuff();
        }
        return $results;
    }

    protected function do_cool_stuff() {
        return 2;
    }
}

class TestableExampleClass extends ExampleClass {
    /** Stores how many times the do_cool_stuff method is called */
    protected $callCount;

    function __construct() {
        $this->callCount = 0;
    }

    function getCallCount() {
        return $this->callCount;
    }

    /** Increment the call counter, and then use the base class's functionality */
    protected function do_cool_stuff() {
        $this->callCount++;
        return parent::do_cool_stuff();
    }
}


class ExampleClassTest extends PHPUnit_Framework_TestCase {

    public function test_do_stuff() {
        $example = new ExampleClass();
        $this->assertEquals(2, $example->do_stuff(false));
        $this->assertEquals(4, $example->do_stuff(true));
    }

    public function test_do_cool_stuff_is_called_correctly() {
        // Try it out the first way
        $firstExample = new TestableExampleClass();
        $this->assertEquals(0, $firstExample->getCallCount());
        $firstExample->do_stuff(false);
        $this->assertEquals(1, $firstExample->getCallCount());

        // Now test the other code path
        $secondExample = new TestableExampleClass();
        $this->assertEquals(0, $secondExample->getCallCount());
        $secondExample->do_stuff(true);
        $this->assertEquals(2, $secondExample->getCallCount());
    }
}

Интересно, действительно ли подсчет количества вызовов защищенного метода действительно хороший тест.Он довольно сложно связывает ваш тест с реализацией.Действительно ли имеет значение, вызывается ли он дважды, или вас больше интересует взаимодействие с другими объектами?Или, может быть, это указывает на то, что do_cool_stuff требуется рефакторинг на два отдельных метода:

class ExampleClass {
    public function do_stuff($runTwice) {
       if ($runTwice) {
          return $this->do_cool_stuff_twice();
       } else {
          return $this->do_cool_stuff_once();
       }
    }
    //...
 }
1 голос
/ 28 сентября 2010

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

$IAmDeclaredOutsideOfTheFunction;

затем используйте его для хранения счетчика и просто проверьте его после вызова функций и классов.

...