微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Codeception 中的单元测试:如何将 Codeception 指向我的代码?

如何解决Codeception 中的单元测试:如何将 Codeception 指向我的代码?

我正在编写一组简单的 PHP 函数,我只使用纯 PHP7,没有框架,什么都没有。这些函数稍后将在 CMS 的插件中使用,但这不是重点。我想使用 Codeception 为我的函数编写单元测试(为了熟悉它,我知道 Codeception 在这里基本上只运行 PHPUnit),但我真的不知道如何以合理的方式将 Codeception 指向我的代码。>

我的结构如下:我有 path/to/functions.PHP 包含我想要测试的函数,大致如下:

<?PHP

namespace App;

if (!defined('CONST')) {
    die('What are you doing? Get out of here!');
}

function change_string($string){
    return $string . '123';
}

我使用 Composer 将 Codeception 安装到我的项目的根目录,并使用 Codeception bootstrap 开始,然后我还使用 Codeception 生成单元测试文件,并在其中添加了我的单元测试。现在大多数关于该主题的教程/解释/文章只是编写测试,而 Codeception 神奇地知道在哪里可以找到要测试的代码。这对我来说是零意义的,并且在我的情况下不起作用。所以我所做的是以下内容

<?PHP

class NamesPathsTest extends \Codeception\Test\Unit
{
    /**
     * @var \UnitTester
     */
    protected $tester;
    
    protected function _before()
    {
        defined('CONST') or define('CONST','XXX');
        require_once('path/to/functions.PHP');
    }

    protected function _after()
    {
    }

    // tests
    public function testChangeString() {
        $this->assertEquals('a123',App\change_string('a'));
    }
}

这行得通,但我认为必须有更好的方法来向 Codeception 解释运行代码的位置,而不是使用 require_once('path/to/functions.PHP')。这个怎么做?将 Codeception 指向我的代码的智能方法是什么?它还可以处理定义常量,以便我可以实际测试函数吗?

解决方法

您的应用程序代码如何知道函数和类在哪里?

神奇的成分叫做autoloading

由于您已经在使用 Composer,因此最简单的方法是配置 Composer 以加载您的类和函数。

自动加载仅适用于类,对于它们,您可以映射 namespace prefix to directory,

{
    "autoload": {
        "psr-4": {
            "Monolog\\": "src/","Vendor\\Namespace\\": ""
        }
    }
}

必须包含包含函数的文件,但 Composer 可以帮助with that too

{
    "autoload": {
        "files": ["path/to/functions.php"]
    }
}

综合结果:

{
    "autoload": {
        "files": ["path/to/functions.php"]
        "psr-4": {
            "Monolog\\": "src/","Vendor\\Namespace\\": ""
        }
    }
}

由于 Codeception 是使用 Composer 安装的,因此无需额外工作即可在测试中获得自动加载工作。 要从应用程序代码中的自动加载中受益,您必须在入口点附近require 'vendor/autoload.php';

关于你经常问的问题,没有人使用这种方式来阻止直接执行文件,将代码从公共目录中移开并只留下可以直接访问的小型 index.php 文件在公共目录中更简单也更安全.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?