PHPUnit: тестирование абстрактного класса без конкретных методов - PullRequest
2 голосов
/ 15 сентября 2010

У меня следующий абстрактный класс, и у меня есть вопрос о том, как написать для этого модульный тест.Это на самом деле нужно?Поскольку у этого класса нет конкретных методов.

<?php

abstract class PickupPoint_Abstract {
    public function __construct($client) {}
    public function getPickupPoints($countryCode, $postalCode, $city) {}
    public function getPickupPointDetails($pickupPointId, $countryCode) {} }

Ответы [ 3 ]

4 голосов
/ 15 сентября 2010

Поскольку вы не можете тестировать на ожидаемое поведение, кажется, действительно сложно произвести какой-либо значимый тест.


Если у вас есть хотя бы один конкретный метод, вы можете смоделировать класс и протестировать этот метод, но без какого-либо кода для тестирования, я бы сказал, что вы подходите.

(Полагаю, вы знаете это всегда, но для завершения: См. Пример 11.8 для getMockForAbstractClass на сайте phpunit )


Несмотря на это, мне любопытно, почему вы не определили методы как абстрактные:

<?php
abstract class PickupPoint_Abstract {
    abstract public function __construct($client);
    abstract public function getPickupPoints($countryCode, $postalCode, $city);
    abstract public function getPickupPointDetails($pickupPointId, $countryCode); }

, поскольку только тогда интерпретатор обеспечит реализацию всех методов в дочерних классах.

2 голосов
/ 15 сентября 2010

Нет, вам не нужно тестировать его, потому что тестировать нечего.

Кстати, абстрактные методы должны быть определены как

<?php
abstract class PickupPoint_Abstract {
    public function __construct($client) {}
    abstract public function getPickupPoints($countryCode, $postalCode, $city);
    abstract public function getPickupPointDetails($pickupPointId, $countryCode);
}
?>

Вы сделали хуки, которыене может быть переопределено.

См. Абстракция класса .

1 голос
/ 02 августа 2012

Для этого случая и для тестирования интерфейса я бы написал как минимум 3 теста:

protected setUp() {
    $this->_object = $this->getMockForAbstractClass(
       'PickupPoint_Abstract', array(), '', false
    );
}

public function testInstanceOf() {
    $this->assertInstanceOf('PickupPoint_Abstract', $this->_object);
}

public function testMethodsExistance() {
    $methods = get_class_methods($this->_object);
    $this->assertTrue(in_array('getPickupPoints', $methods));
    $this->assertTrue(in_array('getPickupPointDetails', $methods));
    $this->assertTrue(in_array('__construct', $methods));
}

public function testMethodCount() {
    $methods = get_class_methods($this->_object);
    /**
     * PHPUnit add seven own methods in 3.6.11 + __clone + count of these methods
     */
    $this->assertEquals(11, count($methods));
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...