微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

zend-framework – 在Zend Framework应用程序中的PHPUnit中进行存根和模拟

我是Zend Framework和 PHPUnit的新手.我正在将遗留应用程序转换为MVC架构,并且正在尝试编写单元测试.我对单元测试概念有点熟悉,但总的来说,它一直困扰着存根和嘲弄.例如,请考虑以下内容

在控制器操作中,我试图测试我传入的成员ID.然后我使用ID初始化成员对象.然后,我调用与成员对象关联的多个方法,并将返回值分配给视图对象.

class A extends Zend_Controller_Action {
    public function viewAction() {
        $member = new Member($this->getRequest()-> getParam('id'));

        //perform varIoUs calls on the member object 

        $gender = $member->getGender();
        ...

        //assign the return values to the view object

        $this->view->assign('gender',$gender);   
        ...

     }
}

如何在我的测试中模拟$member变量,以便我可以自定义方法返回值?

如果我的理解不正确,我会非常感谢一些指导.

谢谢!

解决方法

如果我理解正确,你就是在为这个动作写一个测试.在这种情况下,由于在方法内部创建了新实例,因此无法模拟$member.这就是为什么我们都努力尽可能多地在对象图中浮动尽可能多的新陈述(DI).

通常有一个特殊的PHPunit测试用例Zend_Test_PHPUnit来测试你的控制器.

但事实上,正确测试ZF控制器非常困难甚至不可能(意味着完全隔离).您最好测试应用程序的其余部分,通用库等.

换句话说,在ZF1逻辑中,控制器是中央布线位置(在引导程序之后),传统上使用许多新语句.显然,这会导致不可测试性,因为每个创建而不是注入的实例都是不可移植的.

正如@vascowhite指出的那样,追求精益控制器也是一件好事.这意味着,尽可能多地将逻辑移动到模型层.这将导致更少的冗余(DRY)和更好的可测试性.

但要注意不要让你的模型膨胀.有时,您可能希望将一些代码分解为其他组件.

一个问题是你不能模拟前端控制器,因为它是一个单例.所以你真的没有很多选择来测试这样的动作.唯一的选择是注入成员实例或从注册表中获取它(也不是一个好主意).

因此,鉴于所有这一点很明显,您无法达到完全隔离的动作测试.但

不过,ZF2将更容易测试.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐