#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()