1

目前,我正在尝试更新和扩展我对 Zend Framework 2 的知识,并且正在查看Zend 的用户指南,特别是有关Routing and Controllers的页面。

看到四个几乎相同的用于断言操作的测试函数可以访问,这冒犯了我的最佳实践概念,因此我重写了最后四个方法,添加了第五个作为帮助程序,如下所示:

        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 框架,我可能会使用require_once.,但我发现在这个错综复杂的文件网络中找到正确的路径是不可能的。谷歌搜索这个主题似乎暗示我应该用自动加载器做点什么

有人可以告诉我我应该/必须添加什么代码

  • 公共/index.php
  • 模块/专辑/测试/AlbumTest/Controller/AlbumControllerTest.php
  • 和/或任何其他文件

为了我可以更换线条

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

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

这让我整个晚上都发疯了,所以提前谢谢!

4

3 回答 3

0

在您的模块中创建测试文件夹并放置 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

我认为第一个问题是您是否使用作曲家(https://getcomposer.org/)?似乎您有一个供应商文件夹似乎表明了这一点,但是您没有供应商/autoload.php ..您在该文件夹中还有什么..?

我发现使用 composer 处理自动加载简化了很多事情,它与 zf2 集成得非常好(如果可能的话,它将使用 composer autoload)......此外,它还包含来自网络的其他代码库,但也同一台机器上的其他 git 存储库真的很容易(所以你可以让你的断言库跨项目可用)..但我离题了......

例如,这是我放入 composer.json 的内容,以便能够从手动创建的“/src”文件夹中自动加载文件(使用“Foo”作为我的供应商名称):

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

例如,以文件 'src/Foo/Form/View/Helper/FormElement.php' 为例:我可以在我的测试中将其引用为 '\Foo\Form\View\Helper\FormElement'。请注意,composer 还允许您使用 psr-4,它在某种程度上使文件夹结构扁平化。

另请注意,正如其他帖子所建议的那样,您必须在 Boostrap.php 中包含作曲家自动加载器:

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 回答
0

只需在 PHPUnit 的引导程序中包含自动加载。

了解 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 回答