Проблемы с путём включения в PHPUnit - PullRequest
0 голосов
/ 24 августа 2010

Это меня озадачило.Я работаю с PHPUnit уже пару месяцев, так что я не такой уж зеленый ... но я с нетерпением жду, когда меня укажут в направлении очевидной ошибки, которую я совершаю!Процесс инициализации, описанный ниже, работает нормально, если я запускаю «приложение» из браузера - но PHPUnit задыхается ... кто-нибудь может избавить меня от моих страданий?

Я пытаюсь протестировать домашний варочный MVC, для учебных целей.Это следует типичной схеме ZF.Вот страница указателя:

include './../library/SKL/Application.php';
$SKL_Application = new SKL_Application();
$SKL_Application->initialise('./../application/configs/config.ini');

Вот класс приложения (первые дни ...)

include 'bootstrap.php';

class SKL_Application {

    /**
     * initialises the application
     */
    public function initialise($file) {
        $this->processBootstrap();
        //purely to test PHPUnit is working as expected
        return true;
    }

   /**
    * iterates over bootstrap class and executes 
    * all methods prefixed with "_init"
    */
    private function processBootstrap() {
        $Bootstrap = new Bootstrap();
        $bootstrap_methods = get_class_methods($Bootstrap);

        foreach ($bootstrap_methods as $method) {
            if(substr($method,0,5) == '_init'){
                $bootstrap->$method();
            }
        }
        return true;
    }
}

Вот тест:

require_once dirname(__FILE__).'/../../../public/bootstrap.php';
require_once dirname(__FILE__).'/../../../library/SKL/Application.php';


class SKL_ApplicationTest extends PHPUnit_Framework_TestCase {
   protected $object;


   protected function setUp() {
       $this->object = new SKL_Application();
   }

   /**
    * Tears down the fixture, for example, closes a network connection.
    * This method is called after a test is executed.
    */
   protected function tearDown() {
   }


   public function testInitialise() {
       $this->assertType('boolean',$this->object->initialise());

   }

}

Но я продолжаюспотыкаясь на первом препятствии !!

PHP Warning:  include(bootstrap.php): failed to open stream: 
No such file or directory in path\to\files\SKL\Application.php on line 9

есть идеи?

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Используйте include_once или еще лучше require_once вместо include, чтобы включить bootstrap.php в файл класса приложения. Несмотря на то, что он уже загружен, include загружает его снова, но, поскольку он явно не находится на пути включения, вы получаете ошибку.

0 голосов
/ 25 августа 2010

Спасибо Раулю Дьюку за то, что он подтолкнул меня в правильном направлении, вот где я дошел до сих пор

1 - добавить корень приложения в путь включения

2 - сделать все пути включения относительно корня приложения

3 - включить файл в свои модульные тесты, который выполняет ту же функцию, но компенсирует относительное местоположение, когда он включен. Я просто использовал realpath () в каталоге с файлами.

Проблема, с которой я столкнулся сейчас, в том, что проклятая штуковина не увидит никаких дополнительных файлов, которые я пытаюсь пропустить.

Итак, я пытаюсь протестировать класс конфигурации, который будет динамически анализировать различные типы файлов. Структура каталогов выглядит следующим образом:

Application_ConfigTest.php
config.ini

Первый тест:

public function testParseFile() {
    $this->assertType('array',$this->object->parseFile('config.ini'));
}

Ошибка:

failed to open stream: No such file or directory

WTF? Он находится в том же каталоге, что и тестовый класс ...

Я решил эту проблему, указав абсолютный (т.е. файловую структуру) путь к файлу конфигурации. Кто-нибудь может мне объяснить, как PHPUnit разрешает свои пути, или это потому, что сам тестовый класс включен в другом месте, делая относительные пути бессмысленными?

...