Codeception 自动加载类


Codeception autoloading classes

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

假设我有一个用于测试的抽象类,假设"AbstractRepositoryTester"仅用于"存储库"测试套件(我喜欢出于组织目的将内容分开(。

我测试的每个实现"RepositoryContract"的存储库都将有一个测试,该测试也用一些被覆盖的抽象方法扩展了"AbstractRepositoryTester"。

现在,在

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

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

我还尝试使用Codeceptions自动加载类'Codeception'Util'Autoload::与" load"方法,但它似乎不起作用。

现在我在全球_bootstrap中使用require_once,所以最后回答这个问题:

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

我像这样抽象我的测试总体上是否走在正确的轨道上?TDD对我来说是新的,我正在努力改善我的开发工作流程(在Laracasts的帮助下(。

我已经搜索了各个地方的答案来加载我需要的类,但通常我能找到的只是 PHPUnit 特定的答案,这些答案似乎不起作用。我还浏览了Codeception文档,该文档在该主题上感觉有点稀疏,并且API文档没有解释方法调用的用法

,在这种情况下Autoload::load

干杯

- 埃弗隆。

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

  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

将上述说明中的unit替换为acceptancefunctional等,以将其应用于不同的单个组件。

PhpDoc for 'Codeception'Util'Autoload::addNamespace()

/**
 * 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