[英]Unit test in Codeception: How to point Codeception to my code?
我正在編寫一組簡單的 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 指向我的代碼的聰明方法是什么? 它還可以處理定義常量,以便我可以實際測試功能嗎?
您的應用程序代碼如何知道函數和類在哪里?
神奇的成分稱為自動加載。
由於您已經在使用 Composer,最簡單的方法是配置 Composer 以加載您的類和函數。
自動加載僅適用於類,對於它們,您可以將 map命名空間前綴添加到目錄,
{
"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\\": ""
}
}
}
由於 Codeception 是使用 Composer 安裝的,因此無需額外工作即可在測試中進行自動加載工作。 要從應用程序代碼中的自動加載中受益,您必須require 'vendor/autoload.php';
在入口點附近。
關於您經常提出的問題,沒有人使用這種方式來防止直接執行文件,將代碼從公共目錄中移出並只留下可以在公共目錄中直接訪問的小 index.php 文件更簡單,更安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.