Sha*_*obe 27 php phpunit simpletest
我正在尝试将一堆测试从SimpleTest迁移到PHPUnit,我想知道是否有一个等效的SimpleTest的部分模拟.
更新:我似乎无法在文档中找到任何暗示此功能可用的内容,但我想到我可以使用子类.这是一个好主意还是坏主意?
class StuffDoer {
protected function doesLongRunningThing() {
sleep(10);
return "stuff";
}
public function doStuff() {
return $this->doesLongRunningThing();
}
}
class StuffDoerTest {
protected function doesLongRunningThing() {
return "test stuff";
}
}
class StuffDoerTestCase extends PHPUnit_Framework_TestCase {
public function testStuffDoer() {
$sd = new StuffDoerTest();
$result = $sd->doStuff();
$this->assertEquals($result, "test stuff");
}
}
Run Code Online (Sandbox Code Playgroud)
Bre*_*ker 50
从阅读链接页面,SimpleTest部分模拟似乎是一个模拟,其中只有一些方法被覆盖.如果这是正确的,那么该功能由普通的PHPUnit mock处理.
在a里面PHPUnit_Framework_TestCase,你创建了一个模拟
$mock = $this->getMock('Class_To_Mock');
Run Code Online (Sandbox Code Playgroud)
这会创建一个模拟实例,其中所有方法都不做任何操作并返回null 如果您只想覆盖某些方法,则第二个参数to getMock是要覆盖的方法数组.
$mock = $this->getMock('Class_To_Mock', array('insert', 'update'));
Run Code Online (Sandbox Code Playgroud)
将创建一个模拟实例Class_To_Mock与insert和update删除功能,准备要指定自己的返回值.
这些信息在phpunit文档中.
注意,这个答案显示了从5.4开始的PHPUnit版本的更新的代码示例
Nob*_*obu 13
PHPUnit_Framework_TestCase::getMock自phpunit 5.4以来已被弃用.我们可以setMethods改用.
可以在Mock Builder对象上调用setMethods(array $ methods)来指定要用可配置的测试double替换的方法.其他方法的行为不会改变.如果调用setMethods(null),则不会替换任何方法.
https://phpunit.de/manual/current/en/test-doubles.html
$observer = $this->getMockBuilder(Observer::class)
->setMethods(['update'])
->getMock();
Run Code Online (Sandbox Code Playgroud)
注意以上getMock是PHPUnit_Framework_MockObject_MockBuilder::getMock.(phpunit5.6)
该方法setMethods已被弃用。现在它可以工作了:
$mock = $this->getMockBuilder(ClassToMock::class)
->onlyMethods(['insert', 'update'])
->getMock();
Run Code Online (Sandbox Code Playgroud)