0

我将 phpunit 安装为 PHar:

  1. 从 wget http://pear.phpunit.de/get/phpunit.phar下载 PHar 文件
  2. 将其保存在 (/usr/share/phpunit) 中。
  3. 使其可执行(chmod +x phpunit.phar)。
  4. 在 /usr/bin 中创建了指向它的链接。

现在我可以调用它了,但是我必须在 require 调用中定义测试类的路径,或者从目录中定义相对论,我从目录中调用 phpunit(例如示例 1),或者绝对从根目录(例如示例 2 )。

示例 1(文件 /var/www/sandbox/phpunit/tests/FooTest.php)

<?php
require_once('../Foo.php');

class FooTest extends PHPUnit_Framework_TestCase {
    public function testBar() {
        $input = 5;
        $this->assertEquals(5, (new Foo())->bar());
    }
}

示例 2(文件 /var/www/sandbox/phpunit/tests/FooTest.php)

<?php
require_once('/var/www/sandbox/phpunit/Foo.php');

class FooTest extends PHPUnit_Framework_TestCase {
    public function testBar() {
        $input = 5;
        $this->assertEquals(5, (new Foo())->bar());
    }
}

为了能够使用基于主机根的路径,我需要配置什么(以及如何配置)?例如,如果 /var/www/sandbox/phpunit/ 是我网站的根文件夹:

<?php
require_once('/Foo.php');

class FooTest extends PHPUnit_Framework_TestCase {
    public function testBar() {
        $input = 5;
        $this->assertEquals(5, (new Foo())->bar(5));
    }
}

谢谢

4

2 回答 2

1

好吧,如果您不通过 Web 运行程序,您将无法引用 Web 根目录。这是相当明显的。

我能想到的最佳解决方案是将 Web 根目录硬编码为变量或常量到 phpunit 配置或引导文件中,或者使用魔术常量__DIR__来引用相对于当前文件的文件。

无论如何,我倾向于使用后者,即使我通过网络加载,因为它允许我的代码从子目录托管,而不必担心网络根在哪里。

于 2013-02-04T16:42:13.867 回答
0

谢谢你的回复!

我已经用 Arne Blankerts 的Autoload / phpab解决了这个问题。它spl_autoload_register以闭包作为第一个参数调用该函数,并在此匿名函数中定义一个生成的类名数组及其文件(带有像'myclass' => '/path/to/MyClass.php' 这样的元素)。我已将生成的文件包含在我的 phpunit bootstrap.php 中。现在它正在工作。:)

# phpab -o autoload.inc.php .

我的文件结构:

/qwer
/qwer/Foo.php
/tets
/tets/FooTest.php
/tets/phpunit.xml
/autoload.inc.php
/bootstrap.php

/qwer/Foo.php

<?php
class Foo {
    public function bar($input) {
        return $input;
    }
}

/tets/FooTest.php

<?php
class FooTest extends PHPUnit_Framework_TestCase {
    public function testBar() {
        $input = 5;
        $this->assertEquals(5, (new Foo())->bar(5));
    }
}

/tets/phpunit.xml

<phpunit bootstrap="../bootstrap.php" colors="true">
</phpunit>

/autoload.inc.php

<?php
// @codingStandardsIgnoreFile
// @codeCoverageIgnoreStart
// this is an autogenerated file - do not edit
spl_autoload_register(
    function($class) {
        static $classes = null;
        if ($classes === null) {
            $classes = array(
                'foo' => '/qwer/Foo.php',
                'footest' => '/tests/FooTest.php'
            );
        }
        $cn = strtolower($class);
        if (isset($classes[$cn])) {
            require __DIR__ . $classes[$cn];
        }
    }
);
// @codeCoverageIgnoreEnd

/bootstrap.php

<?php
require_once 'autoload.inc.php';

编辑:

这种方法的一个缺点是,每次创建新类后我都必须启动 phpab。好的,对于小型测试项目,可以使用两个突击队的组合:

# phpab -o ../autoload.inc.php .. && phpunit .

或与 . 之类的别名相同myprojectphpunit

于 2013-02-04T19:18:03.323 回答