当前位置: 首页 > 知识库问答 >
问题:

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

红弘盛
2023-03-14

我正在编写一组简单的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引导开始,然后使用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\u once('path/to/functions.php')。如何做到这一点?将Codeception指向我的代码的聪明方法是什么?它还能处理定义常量的问题,这样我就可以实际测试函数了吗?

共有1个答案

宋凌龙
2023-03-14

应用程序代码如何知道函数和类的位置?

神奇的成分叫做自动加载。

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

自动加载仅适用于类,对于类,可以将名称空间前缀映射到目录,

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

必须包含包含函数的文件,但Composer也提供了帮助:

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

综合结果:

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

由于使用Composer安装了Codecpse,因此不需要额外的工作来在测试中获得自动加载工作。要从应用程序代码中的自动加载中获益,您必须在切入点附近要求“供应商/autoload.php”;。

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

 类似资料:
  • 我在使用Yii2进行Codeception时遇到了一些问题。我刚刚升级到Yii 2.0.10,一直在使用本指南 我收到错误:

  • 我有一个PHP应用程序,我们正在添加测试,使用代码欺骗。我们试图添加指定(和验证)到我们的套件,但它不被识别。你如何正确设置指定与代码欺骗一起使用? 在我的composer.json中,我有以下内容: 我在添加指定和验证后运行了作曲家更新,并获得了以下输出: 我有一个这样的测试(主要是由generate:test生成的): 当我运行单元测试时,我会得到以下输出: 我使用的参考文献是:http://

  • 我正在尝试使用yii2 codeception。我有一个名为Client的类,它扩展了ActiveRecord。 规则()函数: 我在tests\codeception\unit\models文件夹中创建了一个名为ClientTest的文件,该文件包含以下内容: 当我使用“codecept run unit--debug”命令运行测试时,我看到

  • 我已经按照他们网站上的指南安装了Codeception。创建第一个测试。 $I=新WebGuy($scenario); $I- $I- $I- 当我们开始测试php codecept.phar运行时,我们得到了什么: Codeception PHP测试框架v1.6.5由Sebastian Bergmann的PHPUnit 3.7.23提供支持。PHP注意:在第163行的phar://C:/wamp

  • 当使用带有PhpBrowser驱动程序的REST模块从代码欺骗测试发出请求时,没有数据和文件通过Silex应用程序。 更改Content-Type标头 将传递给sendPOST的文件数组更改为以下数组: 文件路径文件对象(UploadedFile) 文件数组 该测试可与Silex驱动程序一起使用,但在CI服务器上这不是一个选项。此外,我们还与邮递员进行了检查,API路由按预期工作,文件已发送,一切

  • 我试图在每个测试套件开始时进行一个API调用,但没有找到这样做的方法。在我的模块中,我重载了方法,但是当我试图从REST模块调用时,我得到了错误。我的模块类看起来像这样: 这给了我一个PHP错误: 对/../vendor/codeception/codeception/src/codeception/Module/REST.php:476中的非对象调用成员函数request() 我如何在\u be