Codeception 中的单元测试:如何将 Codeception 指向我的代码?
Unit test in Codeception: How to point Codeception to my code?
我正在写一套简单的PHP函数,我只用纯PHP7,没有框架,什么都没有。这些功能稍后将在 CMS 的插件中使用,但这不是重点。我想使用 Codeception 为我的函数编写单元测试(为了熟悉它,我知道 Codeception 在这里基本上只有 运行s 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 生成单元测试文件,我在其中添加了我的单元测试.现在大多数 tutorials/explanations/articles 关于这个主题的只是编写测试,而 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'));
}
}
这行得通,但我认为必须有比使用 require_once('path/to/functions.php')
更好的方法来向 Codeception 解释 运行 的代码在哪里。这该怎么做?将 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';
靠近入口点。
关于你常问的问题,没有人使用这种方式来防止文件的直接执行,将代码从public目录中移出并只留下小index.php文件更简单和更安全可以直接在 public 目录中访问。
我正在写一套简单的PHP函数,我只用纯PHP7,没有框架,什么都没有。这些功能稍后将在 CMS 的插件中使用,但这不是重点。我想使用 Codeception 为我的函数编写单元测试(为了熟悉它,我知道 Codeception 在这里基本上只有 运行s 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 生成单元测试文件,我在其中添加了我的单元测试.现在大多数 tutorials/explanations/articles 关于这个主题的只是编写测试,而 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'));
}
}
这行得通,但我认为必须有比使用 require_once('path/to/functions.php')
更好的方法来向 Codeception 解释 运行 的代码在哪里。这该怎么做?将 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';
靠近入口点。
关于你常问的问题,没有人使用这种方式来防止文件的直接执行,将代码从public目录中移出并只留下小index.php文件更简单和更安全可以直接在 public 目录中访问。