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 にリンクを作成しました。

これで呼び出すことができますが、必要な呼び出しで、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/ が私の Web サイトのルート フォルダーである場合:

<?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__を使用して現在のファイルに関連するファイルを参照することです。

とにかく後者を使用する傾向があります。Web 経由でロードしている場合でも、Web ルートがどこにあるかを気にせずにコードをサブディレクトリからホストできるためです。

于 2013-02-04T16:42:13.867 に答える
0

返信ありがとうございます!

ArneBlankertsのAutoload/phpabで解決しました。最初の引数としてクロージャを使用して関数を呼び出し、spl_autoload_registerこの無名関数で生成されたクラス名とそのファイルの配列を定義します('myclass' =>'/path/to/MyClass.php'などの要素を使用)。生成されたファイルをphpunitbootstrap.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を起動する必要があることです。OK、小規模なテストプロジェクトでは、2つのコマンドを組み合わせて使用​​できます。

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

または、のようなエイリアスでも同じmyprojectphpunitです。

于 2013-02-04T19:18:03.323 に答える