PHPUnit, Selenium Basic Test не проходит с фатальной ошибкой - PullRequest
3 голосов
/ 31 октября 2011

Я использую 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

Когда я изменяю утверждение, чтобы пройти, 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 ($ failDescription, $ сравнениеFailure);

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

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

Ответы [ 3 ]

4 голосов
/ 02 ноября 2011

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

У меня отлично работает

3 голосов
/ 13 ноября 2011

Эта проблема связана с проблемой # 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.

1 голос
/ 04 ноября 2011

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

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

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

...