如何对 Joomla 2.5 组件进行单元测试

Posted

技术标签:

【中文标题】如何对 Joomla 2.5 组件进行单元测试【英文标题】:How to unit test a Joomla 2.5 component 【发布时间】:2014-11-16 00:56:12 【问题描述】:

谁能提供一个的示例?我正在处理this joomla mvc component example,它不包括单元测试,而且我在任何地方都找不到完整的示例。我的主要问题是:

组件测试代码的放置位置 如何运行组件单元测试 我的测试代码是否正确

Joomla 文档似乎不完整且支离破碎 - 我已经阅读了我在单元测试中可以找到的内容(由于低代表无法发布链接),这似乎是关于测试 Joomla 本身而不是扩展。我找到的最接近的是this,这是我的虚拟测试的基础。

到目前为止我做了什么

组件目录结构:

你好世界/ 管理员/ ... 测试/ bootstrap.php phpunit.xml modelHelloWorldsTest.php 网站/ ... helloworld.xml

为了运行测试,我将组件安装/复制到我的 Joomla 安装中。然后我从 ~joomla/administration/components/com_helloworld/tests 运行以下命令:

php phpunit-4.2.phar --bootstrap bootstrap.php .

我从中收到的

Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5

bootstrap.php:

<?php
error_reporting(E_ALL);

define('_JEXEC', 1);
define('BASEPATH',realpath(dirname(__FILE__).'/../../'));
define('JOOMLA_PATH',realpath(dirname(__FILE__).'/../../../../../'));
define('JOOMLA_ADMIN_PATH',realpath(dirname(__FILE__).'/../../../../'));
$_SERVER['HTTP_HOST'] = 'localhost';
$_SERVER['REQUEST_METHOD'] = 'GET';

if (file_exists(JOOMLA_ADMIN_PATH . '/defines.php'))

    include_once JOOMLA_ADMIN_PATH . '/defines.php';


if (!defined('_JDEFINES'))

    define('JPATH_BASE', JOOMLA_ADMIN_PATH);
    require_once JPATH_BASE . '/includes/defines.php';


require_once JPATH_BASE . '/includes/framework.php';
require_once JPATH_BASE . '/includes/helper.php';
require_once JPATH_BASE . '/includes/toolbar.php';
define('JPATH_COMPONENT',JOOMLA_ADMIN_PATH.'/components/com_content');
$app = JFactory::getApplication('administrator');
include BASEPATH.'/controller.php';

modelsHelloWorldsTest.php:

<?php
class HelloWorldsTest extends \PHPUnit_Framework_TestCase 

    public function testList()
        $c = new ContentController();
        $model = $c->getModel('helloworlds');
        $worlds = $model->getItems();
        var_dump($worlds);
        $this->assertNotEmpty($worlds);
    

phpunit.xml:

<phpunit bootstrap="bootstrap.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    stopOnFailure="false"
    syntaxCheck="false"
    verbose="true">
</phpunit>

【问题讨论】:

这个问题是关于Joomla的具体实现细节,如果你有可能会得到更好的结果,试试the Joomla Q&A StackExhange site 完成 (link)。 【参考方案1】:

Joomla 的单元测试通常使用 PHP 单元框架编写

回答您的问题 在哪里放置组件测试代码:在你的 repo 的顶层,如下所示

组件repo目录结构:

源 管理员/ 网站/ 测试

如何运行组件单元测试:测试执行遵循这种模式

vendor/bin/phpunit --configuration phpunit.xml

更多细节可以在php单元文档https://phpunit.de/documentation.html中找到

你的测试代码是否正确:

您未能使用 getMockBuilder() 模拟您的类和方法以进行测试。

这里有一些例子来看看

https://github.com/joomla-framework/database https://github.com/joomla-extensions/weblinks

【讨论】:

以上是关于如何对 Joomla 2.5 组件进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何对依赖于 ActivatedRoute 参数的组件进行单元测试?

如何对以 TemplateRef 作为输入的 Angular 组件进行单元测试?

如何对自定义 Wicket 组件进行单元测试

如何对 React-Redux 连接组件进行单元测试?

如何在 AngularJS2“final”中对组件进行单元测试?

如何对 Next.js 动态组件进行单元测试?