【问题标题】:How to start testing Zend Framework Models?如何开始测试 Zend 框架模型?
【发布时间】:2010-01-08 18:02:05
【问题描述】:

如何开始在 Zend Framework 1.8+ 应用程序中测试我的模型?

假设我设置了我的应用程序以开始测试。我已经测试了一个控制器,所以我知道它可以工作。我的所有控制器都在扩展我的 ControllerTestCase.php 文件:

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

abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    public $application;

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

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

    public function appBootstrap()
    {
        $this->application->bootstrap();
    }

    public function tearDown()
    {
        Zend_Controller_Front::getInstance()->resetInstance();

        $this->resetRequest();
        $this->resetResponse();

        $this->request->setPost(array());
        $this->request->setQuery(array());
        parent::tearDown();
    }
}

但现在我想开始测试我的模型。我的ModelTestCase.php 似乎不会扩展Zend_Test_PHPUnit_ControllerTestCase,而是Zend_Test_PHPUnit_ModelTestCase,但我所知道的不存在这样的类。如何开始测试我的 Zend Framework 模型?

【问题讨论】:

    标签: zend-framework zend-test


    【解决方案1】:

    有一个基础ControllerTestCase 为您提供,因为需要复杂的步骤来设置和拆除用于测试控制器的环境。输入是一个模拟 HTTP 请求,输出是呈现的 HTML,您需要抓取该 HTML 以查找预期内容。

    模型更像是一个普通的旧 PHP 对象。设置的环境较少。接口只是对对象的方法调用。

    所以我会启动一个 TestCase 类来扩展 PHPUnit 的普通 TestCase,并首先为模型中的每个方法添加至少一个 test 方法(作为 空函数)班级。最终,您的 Model 类中的每个方法都会有许多测试方法,但是创建空的测试方法是避免忘记某些 Model 方法的好方法。

    注意a Model is not a Table——一个模型通常使用一个或多个 Table 对象。通过遵循此模式,您有机会为表创建 mock objects,这样您就可以运行测试套件而无需实时连接到数据库。

    这是一个设置模拟 Table 对象的示例,该对象经过硬编码以返回合成数据集,而不是来自数据库的数据集。

    <?php
    
    class MyModelTest extends PHPUnit_Framework_TestCase
    {
      protected $_model;
    
      public function setUp()
      {
        $foo = $this->getMock('FooTable', array('find'));
        $foo->expects($this->any())
            ->method('find')
            ->will($this->returnValue(array("id"=>"123")));
    
        $this->_model = new MyModel();
        $this->_model->setFooTable($foo);
      }
    
      public function testCountElements()
      {
        $this->_model->get(123);
        $n = $this->_model->countElements();
        $this->assertEquals(1, $n);
      }
    
      public function testAsArray()
      {
        $this->_model->get(123);
        $a = $this->_model->asArray();
        $this->assertType('array', $a);
      }
    
      public function testAddElement()
      {
        // ...etc.
      }
    
      public function testGetElement()
      {
        // ...etc.
      }
    
    }
    

    【讨论】:

    • 谢谢。这是一个很好的解释。我想知道您是否介意在测试时包含更多关于包含/要求/自动加载模型的信息。我有一个扩展抽象模型的模型。也许这就是模拟对象的用武之地?
    • 我在上面添加了一些细节,展示了模拟 Table 对象的使用。加载类是完全正常的,您可以使用require_once 或自动加载来完成。我认为您可能会让这比实际情况更复杂。
    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多