gpt4 book ai didi

zend-framework - Zend Framework 应用程序中的 PHPUnit 中的 stub 和模拟

转载 作者:行者123 更新时间:2023-12-04 06:53:08 25 4
gpt4 key购买 nike

我是 Zend Framework 和 PHPUnit 的新手。我正在将遗留应用程序转换为 MVC 架构,并尝试编写单元测试。我对单元测试的概念有些熟悉,但一般都坚持 stub 和模拟。例如考虑以下内容

在我尝试测试的 Controller 操作中,我传入了一个成员 ID。然后我使用 ID 初始化一个成员对象。然后我调用一些与成员对象关联的方法并将返回值分配给 View 对象。

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,因为新实例是在方法内部创建的。这就是为什么我们都努力将尽可能多的 new 语句 float 到对象图中尽可能远的位置 (DI)。

一般有专门的PHPunit测试用例Zend_Test_PHPUnit测试你的 Controller 。

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

换句话说,在 ZF1 逻辑中, Controller 是中央接线位置(在 Bootstrap 之后),传统上使用了很多 new 语句。显然,这会导致不可测试性,因为创建而不是注入(inject)的每个实例都是不可模拟的。

正如@vascowhite 所指出的,争取精益 Controller 通常也有好处。这意味着,将尽可能多的逻辑移至模型层。这将同时导致更少的冗余 (DRY) 和更好的可测试性。

但也要注意不要让你的模型膨胀。在某一时刻,您可能希望将一些代码分解到其他组件中。

另一个问题是您不能模拟 Front Controller,因为它是一个单例。所以你真的没有太多的选择来测试这样的行动。唯一的选择是注入(inject)成员实例或从注册表中获取它(这也不是一个好主意)。

因此,鉴于所有这些,很明显您无法为您的 Action 测试达到完全隔离。但是

不过,ZF2 将更容易测试。

关于zend-framework - Zend Framework 应用程序中的 PHPUnit 中的 stub 和模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com