2013-06-01 3 views
2

Я пытаюсь создать среду тестирования устройства для приложения CodeIgniter. Я следую this book и получил работу PHPUnit.PHPUnit: Fatal error Класс ClassName не найден

Я в точке, где я тестирование некоторый код модели:

public function testPresent() 
{ 
    $tracker = new Tracker_model(); 

    $tableObj = (object)array('type' => $this->expectedConstants['TABLE']); 
    $visitsObj = (object)array('type' => $this->expectedConstants['VISITS']); 

    $tableObj = $tracker->present($tableObj); 
    $visitsObj = $tracker->present($visitsObj); 

    $this->assertThat($tableObj, $this->isInstanceOf('Tracker_TablePresenter')); 
    $this->assertThat($visitsObj, $this->isInstanceOf('Tracker_VisitsPresenter')); 
} 

Код тестируется заключается в следующем:

public function present($obj) 
{ 
    if(isset($obj->type)) 
    { 
     switch($obj->type) 
     { 
      case self::VISITS: $type = 'Visits'; break; 
      case self::TABLE: 
      default: $type = 'Table'; break; 
     } 

     $className = 'Tracker_'.$type.'Presenter'; 
     $obj = new $className($obj, 'tracker'); 
    } 
    return $obj; 
} 

Он должен загрузить класс Tracker_TablePresenter, который в файле presenters/tracker/TablePresenter.php. Я не могу объяснить всю логику этого механизма, потому что он слишком длинный и сложный, но я знаю, что он работает, потому что на другом компьютере с тем же кодом он проходит тест. На моем компьютере, вместо этого, я получаю эту ошибку:

.......PHP Fatal error: Class 'Tracker_TablePresenter' not found in /home/.../application/models/tracker_model.php on line 42 

Больше информации об ошибке:

PHP Stack trace: 
PHP 1. {main}() /.../vendor/phpunit/phpunit/composer/bin/phpunit:0 
PHP 2. PHPUnit_TextUI_Command::main() /.../vendor/phpunit/phpunit/composer/bin/phpunit:63 
PHP 3. PHPUnit_TextUI_Command->run() /.../vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:129 
PHP 4. PHPUnit_TextUI_TestRunner->doRun() /.../vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:176 
PHP 5. PHPUnit_Framework_TestSuite->run() /.../vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:349 
PHP 6. PHPUnit_Framework_TestSuite->run() /.../vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:705 
PHP 7. PHPUnit_Framework_TestSuite->runTest() /.../vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:745 
PHP 8. PHPUnit_Framework_TestCase->run() /.../vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:775 
PHP 9. PHPUnit_Framework_TestResult->run() /.../vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:776 
PHP 10. PHPUnit_Framework_TestCase->runBare() /.../vendor/phpunit/phpunit/PHPUnit/Framework/TestResult.php:648 
PHP 11. PHPUnit_Framework_TestCase->runTest() /.../vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:831 
PHP 12. ReflectionMethod->invokeArgs() /.../vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976 
PHP 13. Tracker_modelTest->testPresent() /.../vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976 
PHP 14. Tracker_model->present() /.../application/tests/models/Tracker_modelTest.php:38 

Я работаю на Ubuntu, в то время как другой парень, который имеет код работать использует макинтош Это выход моего PHP -v

PHP 5.4.9-4ubuntu2 (cli) (built: Mar 11 2013 16:09:26) 
Copyright (c) 1997-2012 The PHP Group 
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies 
with Xdebug v2.3.0dev, Copyright (c) 2002-2013, by Derick Rethans 

Я также попытался понижая PHP 5.3, так как он не использует 5.3, но ничего. Такая же ошибка. Можете ли вы помочь мне понять, что происходит?

Edit:

Это содержимое файла TablePresenter.php

<?php 

class Tracker_TablePresenter extends Presenter 
{ 
public function values() 
{ 
    $this->ci =& get_instance(); 
    if (!isset($this->values)) { 
     $this->ci->load->model('value_model', 'value'); 
     $this->values = $this->ci->value->getManyForTracker($this->tracker->id); 
    } 
    return $this->values; 
} 
} 

?> 

Edit 2:

Я изменил код в функции present как предложено JoDev так:

public function present($obj) 
{ 
if(isset($obj->type)) 
{ 
    switch($obj->type) 
    { 
     case self::VISITS: $type = 'Visits'; break; 
     case self::TABLE: 
     default: $type = 'Table'; break; 
    } 

    //use include, but require is to force an internal error if the file isn't founded! 
    require_once('presenters/tracker/'.$type.'Presenter.php'); 

    $className = 'Tracker_'.$type.'Presenter'; 
    $obj = new $className($obj, 'tracker'); 
} 
return $obj; 
} 

Теперь я получаю эту ошибку:

PHPUnit 3.7.21 by Sebastian Bergmann. 

Configuration read from .../phpunit.xml 

.......PHP Fatal error: Class 'Tracker_TablePresenter' not found in .../application/models/tracker_model.php on line 61 
PHP Stack trace: 
PHP 1. {main}() .../vendor/phpunit/phpunit/composer/bin/phpunit:0 
PHP 2. PHPUnit_TextUI_Command::main() .../vendor/phpunit/phpunit/composer/bin/phpunit:63 
PHP 3. PHPUnit_TextUI_Command->run() .../vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:129 
PHP 4. PHPUnit_TextUI_TestRunner->doRun() .../vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:176 
PHP 5. PHPUnit_Framework_TestSuite->run() .../vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:349 
PHP 6. PHPUnit_Framework_TestSuite->run() .../vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:705 
PHP 7. PHPUnit_Framework_TestSuite->runTest() .../vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:745 
PHP 8. PHPUnit_Framework_TestCase->run() .../vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:775 
PHP 9. PHPUnit_Framework_TestResult->run() .../vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:776 
PHP 10. PHPUnit_Framework_TestCase->runBare() .../vendor/phpunit/phpunit/PHPUnit/Framework/TestResult.php:648 
PHP 11. PHPUnit_Framework_TestCase->runTest() .../vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:831 
PHP 12. ReflectionMethod->invokeArgs() .../vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976 
PHP 13. Tracker_modelTest->testPresent() .../vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976 
PHP 14. Tracker_model->present() .../application/tests/models/Tracker_modelTest.php:37 

<h4>A PHP Error was encountered</h4> 

<p>Severity: Warning</p> 
<p>Message: include(presenters/tracker/TablePresenter.php): failed to open stream: No such file or directory</p> 
<p>Filename: models/tracker_model.php</p> 
<p>Line Number: 58</p> 

</div><div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;"> 

<h4>A PHP Error was encountered</h4> 

<p>Severity: Warning</p> 
<p>Message: include(): Failed opening 'presenters/tracker/TablePresenter.php' for inclusion (include_path='.../vendor/phpunit/php-text-template:.../vendor/phpunit/phpunit-mock-objects:.../vendor/phpunit/php-timer:.../vendor/phpunit/php-token-stream:.../vendor/phpunit/php-file-iterator:.../vendor/phpunit/php-code-coverage:.../vendor/phpunit/phpunit:.../vendor/symfony/yaml:.../vendor/pdepend/pdepend/src/main/php:.../vendor/phpmd/phpmd/src/main/php:.:/usr/share/php:/usr/share/pear')</p> 
<p>Filename: models/tracker_model.php</p> 
<p>Line Number: 58</p> 

</div>%      
+0

Вы говорите, что он должен загружать класс 'Tracker_TablePresenter', но в сообщении об ошибке говорится, что он не может найти класс' Tracker_VisitsPresenter'. Вероятно, это глупый вопрос, но вы убедились, что файл присутствует и правильно назван для этого класса? (предположительно, находится на 'presenters/tracker/VisitsPresenter.php') – Pudge601

+0

Я отредактировал его. Дело только в том, что, когда я писал вопрос, я прокомментировал строку в коде и попытался с другим классом «Tracker_VisitsPresenter», но проблема была такой же. Поэтому я просто вставил неправильное сообщение об ошибке. – Carlo

+0

Итак, ни один класс не загружается автоматически? – Pudge601

ответ

0

Я держал пари, что он должен делать с правами доступа к файлам на вашем компьютере. Сценарий не может найти файл, потому что Apache не может его открыть.

+0

нет, это не так. Я попытался положить его 777, но ошибка все еще там – Carlo

+0

@hakre: возможно, что я действительно плохо разбираюсь в проблемах, но в этом случае chmodding этот файл до 777 (я не chmodded все, как вы говорите) это была самая быстрая вещь, которую я мог бы сделать. – Carlo

+0

быстро? вы спросили 1 июня. Это ответ вчера. Для устранения неполадок (особенно быстрого) важно не догадываться - на самом деле все в порядке, чтобы угадать в течение первых пяти минут, но если это не привело к результатам за эти 5 минут, прекратите гадать. Это именно то, что я пытаюсь сказать здесь. Вместо этого создайте контрольные точки, а затем проверьте свои проблемы при достижении ожиданий или нет. – hakre

0

Звучит как проблема чувствительности к случаю (вопрос @jospratik). Насколько я знаю, OSX не чувствителен к регистру. Таким образом, это проблема, которая возникла бы при работе с linux vs mac/win.

Изменение имен папок, чтобы начать с прописной полукокса как

Presenters/Tracker/VisitsPresenter.php 
+0

благодарю вас за ответ, но я уже пробовал делать изменения в классах и именах файлов. Я попробовал снова, просто чтобы быть уверенным, но слишком плохо, что это не проблема. – Carlo

+0

Я не говорил о именах классов и именах файлов .. но именах каталогов. Вы посмотрели на это? – tlenss

+0

Да, я пробовал все комбинации, для каталогов тоже. – Carlo

2

Пожалуйста, вы можете попытаться включить класс Мануалы помощью:

public function present($obj) 
{ 
    if(isset($obj->type)) 
    { 
     switch($obj->type) 
     { 
      case self::VISITS: $type = 'Visits'; break; 
      case self::TABLE: 
      default: $type = 'Table'; break; 
     } 

     //use include, but require is to force an internal error if the file isn't founded! 
     require_once('Presenters/Tracker/'.$type.'Presenter.php'); 

     $className = 'Tracker_'.$type.'Presenter'; 
     $obj = new $className($obj, 'tracker'); 
    } 
    return $obj; 
} 

Спасибо на этот тест, вы сможете знать, есть ли ошибка в autoloader или где-либо еще! И скажите, что добавляет ...

[EDIT @ 13/06/2013 10:00]

Где файл, вызывающий TablePresenter в дереве?

Чтобы устранить эту проблему, у вас есть (на мой взгляд) три возможности:
-1) Добавить родительский каталог Presenter в include_path в Serveur! (для получения фактических включений, используйте get_include_path())
-2) Обязательно используйте хороший URL, чтобы включить файл
-3) Используйте абсолютный URL

+0

Спасибо. Я редактировал вопрос с подробностями – Carlo

0

мне кажется, как проблема с классом «Tracker_TablePresenter», который не смог быть найденным. вы использовали правильное пространство имен?

Смежные вопросы