首页 > 编程 > PHP > 正文

PHPUnit单元测试YAF控制层

2020-03-22 20:09:46
字体:
来源:转载
供稿:网友
  • 在Yaf应用中,创建一个控制层UserController:

    <?phpClass UserController extends Yaf_Controller_Abstract {    // init方法相当于控制器的初始化函数,取消自动渲染视图    html' target='_blank'>public function init() {        Yaf_dispatcher::getInstance()->disableView();    }    // 输出需要的JSON信息    private function __responseJson($code=0, $data=FALSE) {        $response = json_encode(array('code'=>$code, 'data'=>$data));        $this->getResponse()->setBody($response);    }    // JSON Action    public function jsonAction($uid=0) {        if ( $uid < 1 ) return $this->__responseJson(-1);         $user_model = new UserModel();        $row = $user_model->fetchRowById($uid);        return $this->__responseJson(0, $row);    }}
    测试控制器是一个相对比较不容易理解的过程,由于控制器本身可能存在输出一段JSON后Exit的过程,会导致Response出来的数据无法别测试用例获取。这里就需要YAF两个特殊的方式来操作:1. 输出的时候需要用到Yaf_Response_Abstract的方法。该方法同时可以在Yaf_Dispatchar调度器中通过设置returnResponse控制是否输出数据,因此我们之前在User控制器中使用:$this->getResponse()->setBody($response);2. YAF本身允许在CLI模式执行,我们可以通过YAF_Request_Sample创建一个简单请求,创建request.php<?php$request = new Yaf_Request_Simple();print_r($request);如我们在命令行下执行request.php,可以看到如下结果:

    基于以上两点,为此我们来创建一个测试用例:UserControllerTest.php 该文件仅用于测试UserController的业务。


    <?phpdefine('APP_PATH', dirname(__FILE__) . '/../../');define('APP_ENV', 'loc');error_reporting(E_ERROR | E_PARSE); Class UserControllerTest extends PHPUnit_Framework_TestCase {     private $__application = NULL;        // 初始化实例化YAF应用,YAF application只能实例化一次    public function __construct() {        if ( ! $this->__application = Yaf_Registry::get('Application') ) {            $this->__application = new Yaf_Application(APP_PATH."/config/application.ini", APP_ENV);            Yaf_Registry::set('Application', $this->__application);        }    }     // 创建一个简单请求,并利用调度器接受Repsonse信息,指定分发请求。    private function __requestActionAndParseBody($action, $params=array()) {        $request = new Yaf_Request_Simple("CLI", "Index", "User", $action, $params);        $response = $this->__application->getDispatcher()            ->returnResponse(TRUE)            ->dispatch($request);        return $response->getBody();    }     // 测试 JsonAction UID存在    public function testJsonUid1Action() {        $response = $this->__requestActionAndParseBody('Json', array('uid'=>1));        $data     = json_decode($response, TRUE);        $this->assertInternalType('array', $data);        $this->assertEquals('0', $data['code']);        $this->assertInternalType('string', $data['data']['username']);        $this->assertRegExp('/^/d+$/', $data['data']['groupid']);        $this->assertRegExp('/^/d+$/', $data['data']['adminid']);        $this->assertRegExp('/^/d+$/', $data['data']['regdate']);    }     // 测试 JsonAction UID不存在,UID不存在返回的code应该是-1    public function testJsonUidNotFoundAction() {        $response = $this->__requestActionAndParseBody('Json');        $data     = json_decode($response, TRUE);        $this->assertInternalType('array', $data);        $this->assertEquals('0', $data['code']);    }}



    注意我们创建请求的过程 (__requestActionAndParseBody):1.设置CLI请求的Request对象信息;2.通过Application获取调度器Dispatcher;3.设置返回接收Response的对象,不自动输出;4.通过Dispatcher自动分发指定的Request对象;5.获取返回的Response主体信息6.进行验证测试结果:第二个Function由于非法请求返回参数code:-1测试失败。
    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表