2

我正在开发一个允许用户通过 SMS 文本消息进行交互的项目。我对 Zend Framework 的请求和响应对象进行了子类化,以从 SMS API 获取请求,然后发回响应。当我通过开发环境“测试”它时它可以工作,但我真的很想进行单元测试。

但是在测试用例类中,它没有使用我的请求对象,而是使用 Zend_Controller_Request_HttpTestCase。我很确定我会对响应对象有同样的问题,只是我还没有到那个时候。

我的简化测试类:

class Sms_IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase {

    ...

    public function testHelpMessage() {

        // will output "Zend_Controller_Request_HttpTestCase"
        print get_class($this->getRequest());

        ...

    }
}

如果我在运行测试之前覆盖请求和响应对象,如下所示:

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

在调用前端控制器进行调度之前,我无法使用 Zend_Controller_Request_HttpTestCase 中的方法(如 setMethod 和 setRawBody)来设置我的测试。

在对请求和响应对象进行子类化后,如何对控制器进行单元测试?

4

2 回答 2

0

您可以尝试在 Sms_IndexControllerTest 中定义 getRequest 和 getResponse 方法,例如:

public function getRequest()
{
    if (null === $this->_request) {
        $this->_request = new Sms_Model_Request;
    }

    return $this->_request;
}

public function getResponse()
{
    if (null === $this->_response) {
        $this->_response = new Sms_Model_Response;
    }
    return $this->_response;
}
于 2012-09-20T06:04:47.480 回答
0

我最终做的是将请求和响应测试用例对象的整个代码复制到我自己的请求和响应类的子类版本中。这是请求对象的要点:

子类化 Request 和 Response 对象并粘贴 RequestTestCase 的整个代码:

class MyApp_Controller_Request_SmsifiedTestCase 
                        extends MyApp_Controller_Request_Smsified {
   // pasted code content of RequestTestCase
}

然后在 ControllerTest 的 setUp() 函数中设置它们:

    class Sms_IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase {
    {

        ...

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

            $this->_request = 
                    new MyApp_Controller_Request_SmsifiedTestCase();
            $this->_response = 
                    new MyApp_Controller_Response_SmsifiedTestCase();
        }

        ...
     }

然后它起作用了。

于 2012-11-27T01:03:57.467 回答