我在使用Codeception自动加载器加载一些抽象测试类时遇到问题。抽象类的原因是模仿应用程序中使用的类的结构,以减少彻底测试应用程序所需的代码量。
假设我有一个用于测试的抽象类,假设"AbstractRepositoryTester
"仅用于"存储库"测试套件(我喜欢出于组织目的将内容分开(。
我测试的每个实现"RepositoryContract
"的存储库都将有一个测试,该测试也用一些被覆盖的抽象方法扩展了"AbstractRepositoryTester
"。
执行此操作时,抽象类将不会在测试期间加载,而必须在引导程序中手动加载。还有另一个抽象扩展了原版Codeception测试类,以便我可以设置一些变量(即laracasts/testdummy(。
如果不手动输入_boostrap文件,这两个类都将无法加载。除此之外,特定于套件的引导程序文件无法加载文件或似乎根本无法执行,因此我被迫将所有套件的所有引导程序代码放入全局_bootstrap
文件中。
我还尝试使用Codeceptions自动加载类'Codeception'Util'Autoload::
与" load
"方法,但它似乎不起作用。
现在我在全球_bootstrap
中使用require_once,所以最后回答这个问题:
是否有一种正确的方法来自动加载(或仅加载(一个类,以用作全局和每个套件的测试的一部分?
我像这样抽象我的测试总体上是否走在正确的轨道上?TDD对我来说是新的,我正在努力改善我的开发工作流程(在Laracasts的帮助下(。
我已经搜索了各个地方的答案来加载我需要的类,但通常我能找到的只是 PHPUnit 特定的答案,这些答案似乎不起作用。我还浏览了Codeception文档,该文档在该主题上感觉有点稀疏,并且API文档没有解释方法调用的用法
,在这种情况下Autoload::load
干杯
- 埃弗隆。
您可以对整个测试服执行此操作,也可以仅为单个组件执行此操作。例如,对于"仅单元测试",请执行以下操作:
- 将
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
- 创建
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
替换为acceptance
、functional
等,以将其应用于不同的单个组件。
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