- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 bin/cake bake plugin PluginName
创建了一个插件。部分原因是它创建了 phpunit.xml.dist
,但 bake 不会创建所需的文件夹结构或 tests/bootstrap.php
文件。
问题
当我运行 phpunit
时收到“未执行测试”消息:
$ phpunit
PHPUnit 5.1.3 by Sebastian Bergmann and contributors.
Time: 239 ms, Memory: 4.50Mb
No tests executed!
背景信息
我已经在 tests/TestCase
下的插件文件夹中创建了我的测试。我不认为它们是问题所在,但我会在最后发布它们。
我正在使用默认的 phpunit.xml.dist
文件,并将其用于 tests/bootstrap.php
:
$findRoot = function ($root) {
do {
$lastRoot = $root;
$root = dirname($root);
if (is_dir($root . '/vendor/cakephp/cakephp')) {
return $root;
}
} while ($root !== $lastRoot);
throw new Exception("Cannot find the root of the application, unable to run tests");
};
$root = $findRoot(__FILE__);
unset($findRoot);
chdir($root);
define('ROOT', $root);
define('APP_DIR', 'App');
define('WEBROOT_DIR', 'webroot');
define('APP', ROOT . '/tests/App/');
define('CONFIG', ROOT . '/tests/config/');
define('WWW_ROOT', ROOT . DS . WEBROOT_DIR . DS);
define('TESTS', ROOT . DS . 'tests' . DS);
define('TMP', ROOT . DS . 'tmp' . DS);
define('LOGS', TMP . 'logs' . DS);
define('CACHE', TMP . 'cache' . DS);
define('CAKE_CORE_INCLUDE_PATH', ROOT . '/vendor/cakephp/cakephp');
define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS);
define('CAKE', CORE_PATH . 'src' . DS);
require ROOT . '/vendor/autoload.php';
require CORE_PATH . 'config/bootstrap.php';
单元测试
这存在于 tests/TestCase/Color.php
<?php
namespace Contrast\TestCase;
use Cake\TestSuite\TestCase;
use Contrast\Text\Color;
/**
* Contrast Text Color tests
*/
class TextColorTest extends TestCase
{
/**
* @test
* @return void
*/
public function testShouldHandleVarietyOfColors()
{
# Returns black
$this->assertEquals(Color::getBlackWhiteContrast('#FFFFFF'), 'black');
// Why won't you fail??
$this->assertEquals(true, false);
}
最佳答案
基础命名空间应该是Contrast\Test
,这也是 bake 应该添加到您的应用程序中的内容 composer.json
文件 autoload
和 autoload-dev
部分,以及烘焙插件 composer.json
文件。如果您拒绝烘焙以编辑您的内容 composer.json
文件,您应该手动添加自动加载条目
"autoload": {
"psr-4": {
// ...
"Contrast\\": "./plugins/Contrast/src"
}
},
"autoload-dev": {
"psr-4": {
// ...
"Contrast\\Test\\": "./plugins/Contrast/tests"
}
},
并重新转储自动加载器
$ composer dump-autoload
因此您的示例测试的命名空间应该是 Contrast\Test\TestCase
.
测试文件也需要以Test
为后缀以便 PHPUnit 识别它们。为了使文件可以自动加载,您应该坚持使用 PSR-4,即文件应与类同名,即您的测试文件应命名为 TextColorTest.php
。 , 不是 Color.php
.
当将插件作为应用程序的一部分进行测试时,插件测试中不一定需要 Bootstrap 文件(bake 应该,但实际上会生成一个),因为您可以使用应用程序的配置来运行它们,它有一个测试引导文件 ( tests/bootstrap.php
),其中包含您的应用程序引导文件 ( config/bootstrap.php
)。
因此,测试将从您的应用程序基本文件夹运行,并且您必须传递插件路径,例如
$ vendor/bin/phpunit plugins/Contrast
或者你会在你的应用程序主 phpunit 配置文件中添加一个额外的插件测试套件,它说 <!-- Add your plugin suites -->
<testsuite name="Contrast Test Suite">
<directory>./plugins/Contrast/tests/TestCase</directory>
</testsuite>
这样插件测试将与您的应用测试一起运行。
最后,如果存在适当的引导文件,您还可以从插件目录运行测试。默认的当前看起来像:
<?php
/**
* Test suite bootstrap for Contrast.
*
* This function is used to find the location of CakePHP whether CakePHP
* has been installed as a dependency of the plugin, or the plugin is itself
* installed as a dependency of an application.
*/
$findRoot = function ($root) {
do {
$lastRoot = $root;
$root = dirname($root);
if (is_dir($root . '/vendor/cakephp/cakephp')) {
return $root;
}
} while ($root !== $lastRoot);
throw new Exception("Cannot find the root of the application, unable to run tests");
};
$root = $findRoot(__FILE__);
unset($findRoot);
chdir($root);
require $root . '/config/bootstrap.php';
另见
以独立方式开发插件时,这是您真正需要设置环境的 Bootstrap 文件的时候,这就是插件所在的位置 composer.json
正在使用 bake 生成的文件。默认情况下,后者看起来像
{
"name": "your-name-here/Contrast",
"description": "Contrast plugin for CakePHP",
"type": "cakephp-plugin",
"require": {
"php": ">=5.4.16",
"cakephp/cakephp": "~3.0"
},
"require-dev": {
"phpunit/phpunit": "*"
},
"autoload": {
"psr-4": {
"Contrast\\": "src"
}
},
"autoload-dev": {
"psr-4": {
"Contrast\\Test\\": "tests",
"Cake\\Test\\": "./vendor/cakephp/cakephp/tests"
}
}
}
烘焙插件时生成的测试 Bootstrap 文件无法开箱即用,因为它所做的只是尝试加载 config/bootstrap.php
您的插件文件,默认情况下甚至不存在。
测试 Bootstrap 文件需要做什么当然取决于插件在做什么,但至少它应该
为了举例,这里有一个 tests/bootstrap.php
当前 cakephp/app
的副本示例应用程序模板,即它基本上配置了一个完整的应用程序环境(应用程序定义为在 tests/TestApp
文件夹中找到):
// from `config/paths.php`
if (!defined('DS')) {
define('DS', DIRECTORY_SEPARATOR);
}
define('ROOT', dirname(__DIR__));
define('APP_DIR', 'test_app');
define('APP', ROOT . DS . 'tests' . DS . APP_DIR . DS);
define('CONFIG', ROOT . DS . 'config' . DS);
define('WWW_ROOT', APP . 'webroot' . DS);
define('TESTS', ROOT . DS . 'tests' . DS);
define('TMP', ROOT . DS . 'tmp' . DS);
define('LOGS', TMP . 'logs' . DS);
define('CACHE', TMP . 'cache' . DS);
define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'vendor' . DS . 'cakephp' . DS . 'cakephp');
define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS);
define('CAKE', CORE_PATH . 'src' . DS);
// from `config/app.default.php` and `config/bootstrap.php`
use Cake\Cache\Cache;
use Cake\Console\ConsoleErrorHandler;
use Cake\Core\App;
use Cake\Core\Configure;
use Cake\Core\Configure\Engine\PhpConfig;
use Cake\Core\Plugin;
use Cake\Database\Type;
use Cake\Datasource\ConnectionManager;
use Cake\Error\ErrorHandler;
use Cake\Log\Log;
use Cake\Mailer\Email;
use Cake\Network\Request;
use Cake\Routing\DispatcherFactory;
use Cake\Utility\Inflector;
use Cake\Utility\Security;
require ROOT . DS . 'vendor' . DS . 'autoload.php';
require CORE_PATH . 'config' . DS . 'bootstrap.php';
$config = [
'debug' => true,
'App' => [
'namespace' => 'App',
'encoding' => env('APP_ENCODING', 'UTF-8'),
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
'base' => false,
'dir' => 'src',
'webroot' => 'webroot',
'wwwRoot' => WWW_ROOT,
'fullBaseUrl' => false,
'imageBaseUrl' => 'img/',
'cssBaseUrl' => 'css/',
'jsBaseUrl' => 'js/',
'paths' => [
'plugins' => [ROOT . DS . 'plugins' . DS],
'templates' => [APP . 'Template' . DS],
'locales' => [APP . 'Locale' . DS],
],
],
'Asset' => [
// 'timestamp' => true,
],
'Security' => [
'salt' => env('SECURITY_SALT', '__SALT__'),
],
'Cache' => [
'default' => [
'className' => 'File',
'path' => CACHE,
'url' => env('CACHE_DEFAULT_URL', null),
],
'_cake_core_' => [
'className' => 'File',
'prefix' => 'myapp_cake_core_',
'path' => CACHE . 'persistent/',
'serialize' => true,
'duration' => '+2 minutes',
'url' => env('CACHE_CAKECORE_URL', null),
],
'_cake_model_' => [
'className' => 'File',
'prefix' => 'myapp_cake_model_',
'path' => CACHE . 'models/',
'serialize' => true,
'duration' => '+2 minutes',
'url' => env('CACHE_CAKEMODEL_URL', null),
],
],
'Error' => [
'errorLevel' => E_ALL & ~E_DEPRECATED,
'exceptionRenderer' => 'Cake\Error\ExceptionRenderer',
'skipLog' => [],
'log' => true,
'trace' => true,
],
'EmailTransport' => [
'default' => [
'className' => 'Mail',
// The following keys are used in SMTP transports
'host' => 'localhost',
'port' => 25,
'timeout' => 30,
'username' => 'user',
'password' => 'secret',
'client' => null,
'tls' => null,
'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
],
],
'Email' => [
'default' => [
'transport' => 'default',
'from' => 'you@localhost',
//'charset' => 'utf-8',
//'headerCharset' => 'utf-8',
],
],
'Datasources' => [
'test' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
//'port' => 'non_standard_port_number',
'username' => 'my_app',
'password' => 'secret',
'database' => 'test_myapp',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
'log' => false,
//'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
'url' => env('DATABASE_TEST_URL', null),
],
],
'Log' => [
'debug' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'debug',
'levels' => ['notice', 'info', 'debug'],
'url' => env('LOG_DEBUG_URL', null),
],
'error' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'error',
'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
'url' => env('LOG_ERROR_URL', null),
],
],
'Session' => [
'defaults' => 'php',
],
];
Configure::write($config);
date_default_timezone_set('UTC');
mb_internal_encoding(Configure::read('App.encoding'));
ini_set('intl.default_locale', Configure::read('App.defaultLocale'));
Cache::config(Configure::consume('Cache'));
ConnectionManager::config(Configure::consume('Datasources'));
Email::configTransport(Configure::consume('EmailTransport'));
Email::config(Configure::consume('Email'));
Log::config(Configure::consume('Log'));
Security::salt(Configure::consume('Security.salt'));
DispatcherFactory::add('Asset');
DispatcherFactory::add('Routing');
DispatcherFactory::add('ControllerFactory');
Type::build('time')
->useImmutable()
->useLocaleParser();
Type::build('date')
->useImmutable()
->useLocaleParser();
Type::build('datetime')
->useImmutable()
->useLocaleParser();
// finally load/register the plugin using a custom path
Plugin::load('Contrast', ['path' => ROOT]);
为了能够从测试应用程序文件夹中自动加载类,您必须在 composer.json
中添加相应的自动加载条目。文件(并再次重新转储自动加载器),例如:
"autoload-dev": {
"psr-4": {
"Contrast\\Test\\": "tests",
"Contrast\\TestApp\\": "tests/test_app/src", // < here we go
"Cake\\Test\\": "./vendor/cakephp/cakephp/tests"
}
}
现在使用 bake 创建了插件,配置了环境并安装了 CakePHP 和 PHPUnit 依赖项,您应该能够像使用应用程序一样运行测试,即
$ vendor/bin/phpunit
关于cakephp - 设置 CakePHP 3 插件测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35565066/
经验丰富的程序员,但对 CakePHP 2.1 不熟悉,我花了一天的时间努力让自定义 Helper 在 View 中工作,遵循手册:http://book.cakephp.org/2.0/en/vie
任何人都可以列出 CakePHP 框架相对于其他 PHP 框架的缺点吗? 1) 请解释为什么缺少的功能对 PHP 项目如此重要? 2) 该缺失的功能如何帮助那些使用具有该功能的框架的 Web 开发人员
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我对 PHP 比较陌生。开始学习 PHP,但后来遇到了 cakePHP,它可以加快开发时间。 阅读文档和博客教程后,我仍然不明白命名约定。我想在我开始做一些例子之前我不会知道,但是为了让我开始,有人可
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
任何人都可以告诉我为什么当一个字段没有翻译时它返回空,而不是默认翻译? 我会感谢所有建议... 不知道你想看我代码的哪一部分,因为它都是直接来自 www.book.cake.org。所以我粘贴了一些代
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在编写一个支持多种测量单位的应用程序。在极少数情况下,用户想要更改他们的测量系统,我需要运行一个查询,该查询应用乘数将应用程序中的每个单位列缩放到正确的测量系统。为了确保所有数据在此操作出现问题时
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 8年前关闭
在用户模型中: var $hasMany = array( 'Photo' => array( 'className' => 'Photo',
剧透:我想更好地了解对 CakePHP 应用程序的请求的生命周期。 背景:我使用的是 CakePHP v2.3。我正在调试一个问题,该问题导致我无法找到的不想要的重定向。我正在尝试通过增量添加 die
在我的 Cake 应用程序中,我有一个 Controller “completed_projects”。它的索引操作不带参数并列出了一些项目。可以访问不同的页面example.com/complete
我找不到有关cakeError()定义为成员函数的任何信息。 documentation仅声明该调用看起来像这样: $this->cakeError(string $errorType [, arra
我创建了一个自定义数据源,该数据源从Web api获取数据,现在我正在研究实现错误处理。 在数据源中,我正在调用$ model-> onError()。在模型中,我创建了onError方法,并且可以使
除了重定向和渲染之外,还有其他命令可以将 Controller 重定向到特定 View 页面吗? 我的重定向为 $this->redirect('/forms/homepage/'.$userId);
我试图在我的字段中查找计数并连接该计数,但它给出错误消息,因为找不到 make_count 并且我在上面创建了相同的字段。 $this->Car->virtualFields['make_count'
我想要条件验证,即在更新密码时隐藏字段,并且密码验证为“6 到 15”个字符!因此密码以哈希格式存储在数据库中,因此不允许我更新。我的模型代码如下, array( 'rule
echo $form->input( 'country_id', array( 'type' => 'select', 'label' => __('C
我正在使用 CakePHP 创建一个锦标赛平台。目前,我已经创建了以下可以完美运行的表格、模型和 Controller :锦标赛、用户和团队。 我还创建了一个“Tournamentuser”表、 Co
我的场景是这样的: 在我的/views/layout/default.ctp 在我的/views/pages/home.ctp Html-
我是一名优秀的程序员,十分优秀!