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();
}

フロント コントローラーを呼び出してディスパッチする前に、setMethod や setRawBody などの Zend_Controller_Request_HttpTestCase のメソッドを使用してテストをセットアップできません。

リクエスト オブジェクトとレスポンス オブジェクトをサブクラス化した後で、コントローラを単体テストするにはどうすればよいですか?

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 テスト ケース オブジェクトのコード全体を、独自の要求および応答クラスのサブクラス化されたバージョンにコピーすることでした。request オブジェクトの要点は次のとおりです。

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 に答える