Как переопределить var_export в PHPUnit? - PullRequest
1 голос
/ 16 ноября 2010

В PHPUnit бывают ситуации, когда утверждение не выполняется, и при сообщении об утверждении PHPUnit автоматически вызывает var_export () для переменной. Допустим, вы назвали этот кусок кода:

$foo = new StdClass();
$foo->bar = 123;
$foo->baz = "Hi there";
$this->assertTrue($foo);

Вывод этого:

Failed asserting that 
stdClass Object
(
   [bar] => 123
   [baz] => Hi there
)
is true.

Если переменная является объектом Exception, это может привести к тому, что модульный тест напечатает мегабайты текста при обходе дерева объектов, включая следы стека и другую информацию. Иногда PHPUnit умирает, потому что ему не хватает памяти, пытаясь вывести все это.

Я знаю, что одним из решений является добавление дополнительного теста, проверяющего, является ли переменная объектом перед выполнением assertTrue или assertEquals. Но моя команда в настоящее время имеет много модульных тестов.

Так что мне было интересно, есть ли способ переопределить поведение PHPUnit по умолчанию при вызове var_export для переменной при создании отчета об ошибке.

Заранее спасибо.

1 Ответ

1 голос
/ 16 ноября 2010

Покопавшись вокруг, я не нашел флаг или что-то для этого, поэтому я попытался вернуться назад из кода:

Соответствующий код (print_r) находится в: PHPUnit_Framework_ComparisonFailure_Object toString(), и я не вижу способа обеспечить другую реализацию для этого класса без изменения кода в phpunit (поскольку объект создается в статическом вызове)

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

Способ, который не зависит от изменения кода phpunit и , может быть менее трудным, чем проходить все ваши тесты, и изменение всех вызовов assertTrue () может быть чем-то вроде этого:

Если во всех ваших тестах используется один базовый класс, его еще проще ввести:

<?php

class ErrorTest extends PHPUnit_Framework_TestCase {

    public function test1() {
        $foo = new StdClass();
        $foo->bar = 123;
        $foo->baz = "Hi there";
        $this->assertTrue($foo);
    }

    public static function assertTrue($x) {
        if(is_object($x)) {
            self::fail("Expecting True, got Object of Type: ".get_class($x));
        }
        parent::assertTrue($x);
    }
}

->

phpunit ErrorTest.php
PHPUnit 3.4.15 by Sebastian Bergmann.

F

Time: 0 seconds, Memory: 4.25Mb

There was 1 failure:

1) ErrorTest::test1
Expecting True, got Object of Type: stdClass

/home/mcsvnls/ErrorTest.php:15
/home/mcsvnls/ErrorTest.php:9

FAILURES!
Tests: 1, Assertions: 0, Failures: 1.

Хотя я не уверен, что это «хорошее» решение, это лучшее, что я мог бы предложить прямо сейчас, возможно, это поможет:)

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