关于如何在PHPUnit中使用setUp()和tearDown()的真实单词示例?

gre*_*emo 28 php testing phpunit unit-testing

方法setUp()tearDown()在每次测试之前和之后调用.但是,真的,有什么真正的单词示例关于我为什么需要这个?

检查其他人的测试,我总是看到类似的东西:

public function setUp()
{
    $this->testsub = new TestSubject();
}

public function tearDown()
{
    unset($this->testsub);
}

public function testSomething()
{
    $this->assertSame('foo', $this->testsub->getFoo());
}
Run Code Online (Sandbox Code Playgroud)

当然,这种方式与"旧"局部变量方式之间几乎没有区别.

Sve*_*ven 30

如果您单独执行每个测试方法,您的测试代码将共享许多行,这些行只是创建要测试的对象.这个共享代码可以(但不应该)进入setup方法.

然后,任何需要完成以创建要测试的对象的内容也会进入setup方法,例如创建注入到测试对象的构造函数中的模拟对象.

这一切都不需要被删除,因为下一次调用setup将使用一组新对象初始化类成员变量.

唯一需要拆卸的是你的测试永久性地留下了什么东西,比如创建的文件或数据库条目.编写执行此类操作的测试确实不是一个好主意,但在某些时候你不能再抽象,必须触摸像硬盘,数据库或真实网络这样的东西.

因此,需要更多的设置而不是拆卸,如果没有为此测试做的工作,我总是删除拆解方法.

关于模拟,我的工作方式如下:

private $_mockedService;
private $_object;
protected function setUp()
{
    $this->_mockedService = $this->getMock('My_Service_Class');
    $this->_object = new Tested_Class($this->_mockService);
}

public function testStuff()
{
    $this->_mockedService->expects($this->any())->method('foo')->will($this->returnValue('bar'));
    $this->assertEquals('barbar', $this->_object->getStuffFromServiceAndDouble());
}
Run Code Online (Sandbox Code Playgroud)