Я пытаюсь создать среду тестирования устройства для приложения 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>%
Вы говорите, что он должен загружать класс 'Tracker_TablePresenter', но в сообщении об ошибке говорится, что он не может найти класс' Tracker_VisitsPresenter'. Вероятно, это глупый вопрос, но вы убедились, что файл присутствует и правильно назван для этого класса? (предположительно, находится на 'presenters/tracker/VisitsPresenter.php') – Pudge601
Я отредактировал его. Дело только в том, что, когда я писал вопрос, я прокомментировал строку в коде и попытался с другим классом «Tracker_VisitsPresenter», но проблема была такой же. Поэтому я просто вставил неправильное сообщение об ошибке. – Carlo
Итак, ни один класс не загружается автоматически? – Pudge601