классы unittest, которые используют self :: в PHP - PullRequest
2 голосов
/ 21 марта 2012

как бы вы протестировали метод класса с побочными эффектами через self::?например:

final class Foo{
    private static $effect = false;
    public static function doit( $arg ){
        if( self::effect ) return;
        self::check_args( $arg );
        self::$effect = true;
    }
    private function check_args($arg){
        #validate and trhow exception if invalid
    }
}

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

Я пока не могу позволить себе возиться с классом.Есть ли способ, которым я могу сделать копию / установить объект так, как он будет работать с self::?

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Класс должен быть переписан в:

class Foo{
    private $effect = false;
    public function doit( $arg ){
        if( $this->effect ) return;
        $this->check_args( $arg );
        $this->effect = true;
    }
    private function check_args($arg){
        #validate and trhow exception if invalid
    }
}

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

1 голос
/ 21 марта 2012

Как насчет добавления в вашу среду тестирования подкласса тестируемого класса, а затем использования его для манипулирования вашей статической переменной.В приведенном ниже примере я немного изменил ваш код, чтобы было проще играть со значением $ effect, а также пришлось увеличить область действия $ effect для защищенного:

<?php
class Foo{
    protected static $effect = "0";
    public static function doit( $arg ) {
        echo 'I got: ' . $arg . ' and effect is: ' . self::$effect . '<br>';
        self::$effect = "1";
    }
}

class FooChild extends Foo {
    public static function setEffect($newEffect) {
        self::$effect = $newEffect;
    }
}

Foo::doit('hello');
Foo::doit('world');
FooChild::setEffect('3');
Foo::doit('three');

Вывод такой:

Я получил: привет и эффект: 0 (первый раз показывает начальное значение)

Я получил: мир и эффект: 1 (второй раз показывает значение, увеличенное на Fooв doit ()

Я получил: три, и эффект: 3 (третий раз показывает, что подкласс смог изменить значение в родительском)

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