2

如何开始在 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();
    }
}

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

4

1 回答 1

7

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

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

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

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

这是一个设置模拟 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.
  }

}
于 2010-01-08T19:24:49.950 回答