Codeception自动加载类

时间:2015-01-19 07:24:21

标签: php class testing autoload codeception

我在使用Codeception自动加载器加载一些抽象测试类时遇到问题。抽象类的原因是模仿应用程序中使用的类的结构,以减少彻底测试应用程序所需的代码量。

假设我有一个用于测试的抽象类,比如“AbstractRepositoryTester”,它只用于“存储库”测试套件(我喜欢将组织用途分开)。

我测试的实现“RepositoryContract”的每个存储库都有一个测试,它还使用一些重写的​​抽象方法扩展了“AbstractRepositoryTester”。

现在执行此操作时,抽象类将不会在测试期间加载,必须在引导程序文件中手动加载。还有另一个抽象扩展了vanilla Codeception测试类,以便我可以设置一些变量(即laracasts / testdummy)。

两个类都无法加载,无需手动输入_boostrap文件。除此之外,特定于套件的引导程序文件无法加载文件或看似执行,因此我不得不将所有套件的所有引导代码放入全局_bootstrap文件中。

我还尝试使用“\Codeception\Util\Autoload::”方法使用Codeceptions自动加载类load,但它似乎无效。

现在我在全局_bootstrap中使用require_once,最后问题是:

是否有正确的方法可以自动加载(或仅加载)一个类,以便在全局和每个套件中用作测试的一部分?

我是否在整体上正确地抽象出我的测试? TDD对我来说是新的,我正在努力改善我的开发工作流程(在Laracasts的帮助下)。

我已经搜索了每个地方的答案来加载我需要的类,但通常我会发现所有的PHPUnit特定的答案似乎不起作用。我还查看了Codeception文档,该文档对主题感到有点稀疏,并且API文档没有解释Autoload::load

的情况下的方法调用用法

干杯,

- Everon。

1 个答案:

答案 0 :(得分:0)

您可以为整个测试服或单个组件执行此操作。例如,仅对于单元测试,请执行以下操作:

  1. bootstrap: my_bootstrap_file.php添加到tests/unit.suite.yml
# Codeception Test Suite Configuration
#
# Suite for unit or integration tests.

actor: UnitTester
bootstrap: my_bootstrap_file.php
modules:
    enabled:
        - Asserts
        - \Helper\Unit

my_bootstrap_file.php打电话,例如bootstrap.php

  1. 创建tests/unit/my_bootstrap_file.php
<?php
\Codeception\Util\Autoload::addNamespace('', 'src');

目录结构应如下所示:

<project root>
src/
tests/
    unit/
        my_bootstrap_file.php
    unit.suite.yml

在上面的说明中用unitacceptance等替换functional,以将其应用于不同的单个组件。

\Codeception\Util\Autoload::addNamespace()的PhpDoc:

    /**
     * Adds a base directory for a namespace prefix.
     *
     * Example:
     *
     * ```php
     * <?php
     * // app\Codeception\UserHelper will be loaded from '/path/to/helpers/UserHelper.php'
     * Autoload::addNamespace('app\Codeception', '/path/to/helpers');
     *
     * // LoginPage will be loaded from '/path/to/pageobjects/LoginPage.php'
     * Autoload::addNamespace('', '/path/to/pageobjects');
     *
     * Autoload::addNamespace('app\Codeception', '/path/to/controllers');
     * ?>
     * ```
     *
     * @param string $prefix The namespace prefix.
     * @param string $base_dir A base directory for class files in the namespace.
     * @param bool $prepend If true, prepend the base directory to the stack instead of appending it;
     *                      this causes it to be searched first rather than last.
     * @return void
     */
    public static function addNamespace($prefix, $base_dir, $prepend = false)

如果您希望将其应用于整个测试套件,而不仅仅是单元测试,请使用codeception.yml代替tests/unit.suite.yml,并使用tests/my_bootstrap_file.php代替tests/unit/my_bootstrap_file.php

<project root>
src/
tests/
    my_bootstrap_file.php
codeception.yml