我已经使用Zend Framework研究了PHPUnit的一些示例,但有一部分我不理解.
在大多数示例中,Application Bootstrap从setUp()
Method中的某种baseClass运行.
为什么不__construct()
呢?有什么好理由吗?
我正在谈论的例子
只是为了记录,我想这是你所指的具体代码:
class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase { public $application; public function setUp() { $this->application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/config/settings.ini' ); $this->bootstrap = array($this, 'bootstrap'); parent::setUp(); } public function tearDown() { Zend_Controller_Front::getInstance()->resetInstance(); $this->resetRequest(); $this->resetResponse(); $this->request->setPost(array()); $this->request->setQuery(array()); } public function bootstrap() { $this->application->bootstrap(); } }
在单元测试中,使用setUp
和tearDown
方法
将世界设置为已知状态,然后在测试完成时将其返回到其原始状态.这种已知状态称为测试夹具.
处理夹具的方式可能在xUnit库之间有所不同,但概念保持不变.另请参阅PHPUnit手册中的fixture章节:
PHPUnit支持共享设置代码.在运行测试方法之前,将调用名为setUp()的模板方法.setUp()是您创建要测试的对象的位置.一旦测试方法运行完毕,无论是成功还是失败,都会调用另一个名为tearDown()的模板方法.tearDown()是清理测试对象的地方.
因此,PHPUnit负责在测试用例类中包含的每个测试setUp
方法之前执行该方法,而在每次执行之后进行处理.tearDown
话虽如此,Zend Framework在PHPUnit之上提供了一个额外的层来运行功能测试,这是对功能的黑盒测试,而不是源代码的各个单元.这是通过扩展Zend_Test_PHPUnit_ControllerTestCase来实现的,这样就可以保证对应用程序资源的访问.
在此特定示例中,在执行测试用例中的每个测试之前引导应用程序.如果我们考虑到我们在任何地方都不需要应用程序资源,例如在原始单元测试(其他测试用例的一部分)中,这是有道理的.