需要 zend 单元测试帮助

发布于 2024-11-03 03:32:02 字数 5523 浏览 2 评论 0原文

我正在使用单元测试来测试 zend 项目, 这是 application.ini

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
resources.frontController.params.displayExceptions = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"


; modules
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.moduleControllerDirectoryName = "controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[] = ""
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.layout.layout = "layout"
resources.view[] =
resources.view.doctype = "XHTML1_STRICT"

; database
resources.db.adapter = "PDO_MYSQL"
resources.db.params.dbname = "demodev"
resources.db.params.password = "demo_core_pass"
resources.db.params.username = "demo_core_user"
resources.db.params.host = "localhost"
resources.db.isDefaultTableAdapter = true

; session
resources.session.save_path = APPLICATION_PATH "/../data/session"
resources.session.use_only_cookies = true
;resources.session.remember_me_seconds = 10

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

[amsterdam : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

这是 phpunit.xml:

<phpunit bootstrap="./application/bootstrap.php"  colors="true">         
<testsuite>
    <directory>./</directory>       
</testsuite>
<filter>
    <whitelist>
        <directory suffix="MyApp.php">../application/</directory>
        <exclude>
            <file>../application/Bootstrap.php</file>
            <file>../application/controllers/ErrorController.php</file>
            <directory suffix=".phtml">../application/</directory>
        </exclude>
    </whitelist>
</filter>


<logging>
    <log type="coverage-html" target="./log/report" charset="UTF-8"
        yui="true" highlight="true" lowUpperBound="50" highLowerBound="80"/>
    <log type="testdox-html" target="./log/testdox.html" />
</logging>         

这是 bootstrap.php

<?php
error_reporting(E_ALL);

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

require_once 'Zend/Application.php';
require_once 'ControllerTestCase.php';
//require_once 'MyApp.php';

这是 ControllerTestCase.php

<?php
require_once 'Zend/Application.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

class ControllerTestCase 
    extends Zend_Test_PHPUnit_ControllerTestCase 
{
    protected $application;

    public function setUp() {
        $this->bootstrap = array($this,'appBootstrap');
        parent::setUp();

    }

    public function appBootstrap() {
        $this->application = 
            new Zend_Application(APPLICATION_ENV,
                                 APPLICATION_PATH.'/configs/application.ini');

        $this->application->bootstrap();

    }
}

这是 IndexControllerTest.php

<?php

require_once 'Zend/Test/PHPUnit/ControllerTestCase.php'; IndexControllerTest 类扩展了 ControllerTestCase {

public function testHomePage() {
    $this->dispatch('/index');
    $this->assertController('index');
    $this->assertAction('menu');
}

}

当我进入测试文件夹,运行命令 phpunit 时,它给我这个错误:

D:\PHP\apache2\htdocs\demo_src\tests>phpunit
PHPUnit 3.5.13 by Sebastian Bergmann.

PHP Fatal error:  Call to a member function hasResource() on a non-object in D:\
PHP\apache2\htdocs\demo_src\application\controllers\ErrorController.php on line
46

Fatal error: Call to a member function hasResource() on a non-object in D:\PHP\a
pache2\htdocs\demo_src\application\controllers\ErrorController.php on line 46

如何解决这个问题?

当我将 IndexControllerTest 更改为一项测试时,例如:

<?php


class IndexControllerTest extends ControllerTestCase
{

    public function testHomePage() {
        $this->assertTrue(true);

    }


}

它可以工作,但是当我将其更改为

<?php

class IndexControllerTest extends ControllerTestCase
{

    public function testHomePage() {
        $this->dispatch('/');

    }
}

ErrorController.php 中的第 46 行时:

public function getLog() {
        $bootstrap = $this->getInvokeArg('bootstrap');
        if (!$bootstrap->hasResource('Log')) {// this is line 46
            return false;
        }
        $log = $bootstrap->getResource('Log');
        return $log;
    }

它仍然给我相同的错误,有什么建议吗?

I am using unit test to test zend project,
this is application.ini

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
resources.frontController.params.displayExceptions = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"


; modules
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.moduleControllerDirectoryName = "controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[] = ""
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.layout.layout = "layout"
resources.view[] =
resources.view.doctype = "XHTML1_STRICT"

; database
resources.db.adapter = "PDO_MYSQL"
resources.db.params.dbname = "demodev"
resources.db.params.password = "demo_core_pass"
resources.db.params.username = "demo_core_user"
resources.db.params.host = "localhost"
resources.db.isDefaultTableAdapter = true

; session
resources.session.save_path = APPLICATION_PATH "/../data/session"
resources.session.use_only_cookies = true
;resources.session.remember_me_seconds = 10

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

[amsterdam : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

this is the phpunit.xml:

<phpunit bootstrap="./application/bootstrap.php"  colors="true">         
<testsuite>
    <directory>./</directory>       
</testsuite>
<filter>
    <whitelist>
        <directory suffix="MyApp.php">../application/</directory>
        <exclude>
            <file>../application/Bootstrap.php</file>
            <file>../application/controllers/ErrorController.php</file>
            <directory suffix=".phtml">../application/</directory>
        </exclude>
    </whitelist>
</filter>


<logging>
    <log type="coverage-html" target="./log/report" charset="UTF-8"
        yui="true" highlight="true" lowUpperBound="50" highLowerBound="80"/>
    <log type="testdox-html" target="./log/testdox.html" />
</logging>         

this is the bootstrap.php

<?php
error_reporting(E_ALL);

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

require_once 'Zend/Application.php';
require_once 'ControllerTestCase.php';
//require_once 'MyApp.php';

this is the ControllerTestCase.php

<?php
require_once 'Zend/Application.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

class ControllerTestCase 
    extends Zend_Test_PHPUnit_ControllerTestCase 
{
    protected $application;

    public function setUp() {
        $this->bootstrap = array($this,'appBootstrap');
        parent::setUp();

    }

    public function appBootstrap() {
        $this->application = 
            new Zend_Application(APPLICATION_ENV,
                                 APPLICATION_PATH.'/configs/application.ini');

        $this->application->bootstrap();

    }
}

this is the IndexControllerTest.php

<?php

require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';
class IndexControllerTest extends ControllerTestCase
{

public function testHomePage() {
    $this->dispatch('/index');
    $this->assertController('index');
    $this->assertAction('menu');
}

}

when I go the the tests folder, run command phpunit, it gives me this error:

D:\PHP\apache2\htdocs\demo_src\tests>phpunit
PHPUnit 3.5.13 by Sebastian Bergmann.

PHP Fatal error:  Call to a member function hasResource() on a non-object in D:\
PHP\apache2\htdocs\demo_src\application\controllers\ErrorController.php on line
46

Fatal error: Call to a member function hasResource() on a non-object in D:\PHP\a
pache2\htdocs\demo_src\application\controllers\ErrorController.php on line 46

How can I fix this problem?

When I change the IndexControllerTest as one test, such as:

<?php


class IndexControllerTest extends ControllerTestCase
{

    public function testHomePage() {
        $this->assertTrue(true);

    }


}

it works, but when I change it to

<?php

class IndexControllerTest extends ControllerTestCase
{

    public function testHomePage() {
        $this->dispatch('/');

    }
}

The 46 line in ErrorController.php is:

public function getLog() {
        $bootstrap = $this->getInvokeArg('bootstrap');
        if (!$bootstrap->hasResource('Log')) {// this is line 46
            return false;
        }
        $log = $bootstrap->getResource('Log');
        return $log;
    }

it still give me the same error, any suggestion?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无风消散 2024-11-10 03:32:02

尝试使用这个 IndexControllerTest 类

class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{

    public function setUp()
    {
        $this->bootstrap = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );
        parent::setUp();
    }

    public function testHomePage()
    {
        $params = array(
            'action' => 'index',
            'controller' => 'index',
            'module' => 'default'
        );
        $url = $this->url($this->urlizeOptions($params));
        $this->dispatch($url);

        // assertions
        $this->assertModule($params['module']);
        $this->assertController($params['index']);
        $this->assertAction($params['action']);
    }

}

Try with this IndexControllerTest class

class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{

    public function setUp()
    {
        $this->bootstrap = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );
        parent::setUp();
    }

    public function testHomePage()
    {
        $params = array(
            'action' => 'index',
            'controller' => 'index',
            'module' => 'default'
        );
        $url = $this->url($this->urlizeOptions($params));
        $this->dispatch($url);

        // assertions
        $this->assertModule($params['module']);
        $this->assertController($params['index']);
        $this->assertAction($params['action']);
    }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文