PHPUnit, базовый тест Selenium завершается с фатальной ошибкой

#php #selenium #phpunit #tostring

#php #selenium #phpunit #tostring

Вопрос:

Я использую PHP 5.3.6 и последнюю версию PHPUnit с Github. Когда я копирую пример 17.1 из документации, он выдает фатальную ошибку при сбое assertTitle . Я получаю это сообщение об ошибке:

 Fatal error: Call to a member function toString() on a non-object in <path>/phpunit/phpunit-selenium/PHPUnit/Extensions/SeleniumTestCase.php on line 1041
 

Когда я меняю утверждение на pass, PHPUnit работает нормально.

Я откопал строку, и это фрагмент :

 protected function onNotSuccessfulTest(Exception $e)
    {
        if ($e instanceof PHPUnit_Framework_ExpectationFailedException) {
            $buffer  = 'Current URL: ' . $this->drivers[0]->getLocation() .
                       "n";
            $message = $e->getComparisonFailure()->toString();
 

$e->getComparisonFailure() возвращает значение NULL, а не объект. Что я делаю неправильно?

Обновить:

Я нашел причину сбоя, хотя исправления пока нет на моем горизонте.

В строке 92 из PHPUnit/Framework/Constraint.php , он вызывает использование

$this->fail($other,$description)

который определяется как:

protected function fail($other, $description, PHPUnit_Framework_ComparisonFailure $comparisonFailure = NULL)

Поскольку PHPUnit_Framework_ComparisonFailure не передается, NULL передается в строке 141 PHPUnit/Framework/Constraint.php

выбросить новое исключение PHPUnit_Framework_ExpectationFailedException( $failureDescription, $ComparisonFailure);

который извлекается с помощью getComparisonFailure(), который должен возвращать объект, как описано выше.

Есть еще идеи?

Комментарии:

1. Вы говорите, что в примере phpunit-selenium по умолчанию, copy-paste, есть ошибка, когда единственное утверждение в нем терпит неудачу, которое при копировании и вставке должно завершиться неудачей?

Ответ №1:

Просто замените $message = $e->getComparisonFailure()->toString(); на $message = $e->getComparisonFailure()->exceptionToString;

У меня все работает нормально

Комментарии:

1. у меня это не работает, потому что объект, возвращаемый $e->getComparisonFailure, равен NULL, а не объект с «exceptionToString» в качестве метода.

2. Я изменил его на exceptionToString из exceptionToString(), и это сработало. Это ошибка в PHPUnit, которая требует запроса на извлечение?

Ответ №2:

Эта проблема связана с проблемой # 66 в проекте PHPUnit-Selenium на Github. Я сделал один коммит, который устраняет эту проблему, и один, который устраняет проблему «setCustomMessage ()», о которой упоминал Мэтью. Я думаю, что обе проблемы были вызваны одним коммитом в PHPUnit 3.6

 $message = $e->getComparisonFailure()->toString();
 

Где изменено на

 // ?: Is "comparison failure" set and therefore an object? (fixes issue #66)
if(is_object($e->getComparisonFailure())) {
    // -> Comparison failure is and object and should therefore have the toString method
    $message = $e->getComparisonFailure()->toString();
}
else {
    // -> Comparison failure is not an object. Lets use exception message instead
    $message = $e->getMessage();
}
 

И в конце onNotSuccessfulTest():

 $e->setCustomMessage($buffer);
 

Где изменено на:

 // ?: Does the setCustomMessage method exist on the exception object? (fixes issue #67)
if(method_exists($e, 'setCustomMessage')) {
    // -> Method setCustomMessage does exist on the object, this means we are using PHPUnit 
    //    between 3.4 and 3.6
    $e->setCustomMessage($buffer);
}
else {
    // -> Method setCustomerMessages does not exist on the object, must make a new exception to 
    //    add the new message (inc. current URL, screenshot path, etc)
    $e = new PHPUnit_Framework_ExpectationFailedException($buffer, $e->getComparisonFailure());
}
 

Надеюсь, оба изменения будут приняты в проект PHPUnit-Selenium. По крайней мере, он исправил проблемы, с которыми я сталкивался с последними обновлениями для PHPUnit и PHPUnit-Selenium от PEAR.

Ответ №3:

Я заменил $message = $e->getComparisonFailure()->toString(); на:

 if($e->getComparisonFailure() == NULL)
{
    $message = $e;
}
else
{
    $message = $e->getComparisonFailure()->toString();
}
 

Я также вернул PHPUnit_Framework_ExpectationFailedException обратно к 3.5.3, поэтому он имеет setCustomMessage()