PHPUnit包含路径问题

时间:2010-08-24 07:39:27

标签: phpunit path include

这个让我难过。我已经和PHPUnit合作了几个月了,所以我不是那么绿......但我期待被指向我正在制造的明显错误的方向!如果我从浏览器运行“app”,下面概述的初始化过程工作正常 - 但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 个答案:

答案 0 :(得分:1)

使用include_once或更好require_once而不是include将bootstrap.php包含在Application类文件中。尽管已经加载include再加载它,但因为它显然不在包含路径上,所以你会收到错误。

答案 1 :(得分:0)

感谢Raoul Duke让我朝着正确的方向前进,这是我到目前为止的所在地

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如何解析它的路径,或者是因为测试类本身包含在其他地方,使相对路径变得毫无意义?