【问题标题】:Codeception autoloading classesCodeception 自动加载类
【发布时间】:2015-03-17 04:02:45
【问题描述】:

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

假设我有一个用于测试的抽象类,假设“AbstractRepositoryTester”仅在“存储库”测试套件中使用(出于组织目的,我喜欢将事物分开)。

我测试的每个实现“RepositoryContract”的存储库都将有一个测试,该测试还使用一些覆盖的抽象方法扩展“AbstractRepositoryTester”。

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

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

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

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

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

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

我已经在每个地方搜索了加载我需要的类的答案,但通常我会找到的只是 PHPUnit 特定的答案,这些答案似乎不起作用。我还仔细阅读了 Codeception 文档,该文档在该主题上感觉有点稀疏,并且 API 文档没有解释 Autoload::load 情况下的方法调用用法

干杯,

- 埃弗隆。

【问题讨论】:

  • 自 2015 年 1 月 19 日起,希望您能找到答案。您能否反思您的问题并解释您是否以及如何完成这项工作?对我来说,这对 dadduckgo 来说是热门歌曲
  • 恐怕我没有找到解决方案iirc。这些天我坚持使用标准的 phpunit。我怀疑我在遇到此问题的项目中没有正确编排我的测试资产。
  • 太糟糕了,谢谢你的回复。也许如果我找到解决方案,我会在这个问题上发布一些关于它的内容。

标签: php class testing autoload codeception


【解决方案1】:

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

  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等,将其应用于不同的单个组件。

\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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多