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

2022-08-30 14:18:54

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

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

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

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

public function testSomething()
{
    $this->assertSame('foo', $this->testsub->getFoo());
}

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


答案 1

如果单独执行每个测试方法,则测试代码将共享大量行,这些行只是创建要测试的对象。此共享代码可以(但不应)进入设置方法。

创建要测试的对象所需的任何操作也都进入设置方法,例如创建注入到测试对象构造函数中的模拟对象。

这些都不需要拆除,因为下一次调用 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());
}

答案 2

您可以实例化一堆夹具对象,并在每个测试中将它们用作实例变量,而不是为每个测试单独构造它们。

您可以在 setUp 中创建文件句柄等资源,然后确保在 tearDown 中关闭它们。如果您正在编写临时文件,则可以确保将其删除。如果打开数据库连接,则可以关闭它(尽管您可能希望在其他地方执行此操作 - /为每个测试文件调用它,而不是为每个测试用例调用它。setupBeforeClasstearDownAfterClass

这只是一个之前/之后的钩子,一般来说,这是一个时髦的东西。使用它来让你的生活更轻松,或者不要使用它。


推荐