1

現在、Zend Framework 2 の知識を更新して拡張しようとしています。Zend's User Guide 、特にRouting and Controllersのページを見ています。

アクションをアサートするための 4 つのほぼ同一のテスト関数にアクセスできるのを見て、私のベスト プラクティスの概念に腹を立てたので、最後の 4 つのメソッドを書き直し、次のようにヘルパーとして 5 番目のメソッドを追加しました。

        private function assertActionCanBeAccessed ($action)
    {
        $this->routeMatch->setParam('action', $action);

        $result     = $this->controller->dispatch($this->request);
        $response   = $this->controller->getResponse();

        $this->assertEquals (200, $response->getStatusCode());
    }


    public function testAddActionCanBeAccessed()    { $this->assertActionCanBeAccessed('add'); }
    public function testDeleteActionCanBeAccessed() { $this->assertActionCanBeAccessed('delete'); }
    public function testEditActionCanBeAccessed()   { $this->assertActionCanBeAccessed('edit'); }
    public function testIndexActionCanBeAccessed()  { $this->assertActionCanBeAccessed('index'); }

PHPUnit を実行したところ、問題なく動作しました。

しかし、この方法は他のコントローラーにも役立つ可能性が高いと思われます。さらに、コード全体でメソッドを共通に使用できるようにする方法を知りたいだけです。

そこで、次のクラスを書きました。

<?php

class ActionTestToolkit
{
    public static function assertActionCanBeAccessed ($testcase, $action)
    {
        $testcase->routeMatch->setParam('action', $action);

        $result     = $testcase->controller->dispatch($testcase->request);
        $response   = $testcase->controller->getResponse();

        $testcase->assertEquals (200, $response->getStatusCode());
    }
}

?>

...そして保存しましたvendor/Flux/library/ActionTestToolkit

Zend Framework がなければ、私は を使用していたでしょうがrequire_once、この絡み合ったファイルの中でパスを正しく取得することは不可能であることがわかりました。そして、件名をグーグルで検索すると、オートローダーで何かをする必要があるかもしれないことが示唆されているようです

誰かが私が追加すべき/追加しなければならないコードを正確に教えてもらえますか

  • public/index.php
  • モジュール/アルバム/テスト/AlbumTest/Controller/AlbumControllerTest.php
  • および/またはその他のファイル

行を置き換えることができるように

public function testAddActionCanBeAccessed() 
       { $this->assertActionCanBeAccessed('add'); }

public function testAddActionCanBeAccessed() 
       { ActionTestToolkit::assertActionCanBeAccessed($this, 'add'); }

これは一晩中私を夢中にさせていたので、事前に感謝します!

4

3 に答える 3

0

モジュールでtestsフォルダーを作成し、そこにphpunit.xmlを配置します

    <?xml version="1.0" encoding="UTF-8"?>

<phpunit
    bootstrap="./bootstrap.php"
    colors="true"
    backupGlobals="false"
>
    <testsuites>
        <testsuite name="FluxModule Test Suite">
            <directory>./</directory>
        </testsuite>
    </testsuites>

</phpunit>

そして、モジュールのクラスがどこにあるかを言うbootstrap.php

    <?php

chdir(__DIR__);

if (!(@include_once __DIR__ . '/../vendor/autoload.php') && !(@include_once __DIR__ . '/../../../vendor/autoload.php')) {
    throw new RuntimeException('vendor/autoload.php could not be found. Did you run `php composer.phar install`?');
}

$autoloader = new Zend\Loader\StandardAutoloader(array('autoregister_zf' => true));
$autoloader->registerNamespaces(array('Flux' => __DIR__ . '/../src/Flux'));
$autoloader->register();
于 2012-11-11T22:59:35.187 に答える
0

PHPUnit のブートストラップに autoload を含めるだけです。

ZF2 がテストを実行する方法を見る

https://github.com/zendframework/zf2/blob/master/tests/phpunit.xml.dist

https://github.com/zendframework/zf2/blob/master/tests/Bootstrap.php

于 2012-11-11T17:10:13.060 に答える
0

最初の質問は、composer( https://getcomposer.org/ )を使用しているかどうかだと思います。vendors フォルダがあるように見えますが、vendor/autoload.php がありません。そのフォルダには他に何がありますか?

composerを使用してautoloadを処理すると、物事がかなり簡素化され、zf2と非常にうまく統合されることがわかりました(可能であればcomposer autoloadを利用します)...また、Webからの追加のコードライブラリを含めるだけでなく、同じマシン上の他のgitリポジトリは本当に簡単です(そのため、アサーションライブラリをプロジェクト間で利用できるようにすることができます)..しかし、私は脱線します...

例として、手動で作成した「/src」フォルダーからファイルを自動ロードできるように composer.json に入れたものを次に示します (ベンダー名として「Foo」を使用)。

{ /* ... */
    "autoload": {
        "psr-0": {"Foo": "src/" }
    }
}

たとえば、ファイル 'src/Foo/Form/View/Helper/FormElement.php' を取り上げます。テストでは、'\Foo\Form\View\Helper\FormElement' として参照できます。composer では、psr-4 も使用できることに注意してください。これにより、フォルダー構造が多少フラットになります。

また、他の投稿で示唆されているように、Boostrap.php に composer autoloader を含める必要があることに注意してください。

phpunit.xml (/tests フォルダー内): .. bootstrap="./Bootstrap.php" ..

Bootstrap.php (/tests フォルダー内):

chdir(dirname(__DIR__));


// Setup autoloading
require 'init_autoloader.php';

composer の使用を開始するのは少しオーバーヘッドがかかるように思えるかもしれませんが、長い目で見れば非常に単純化されます...

これが少し役立つことを願っています:)

于 2014-06-04T11:05:24.063 に答える