PHPUnit中的SimpleTest"部分模拟"的等价物?

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_Mockinsertupdate删除功能,准备要指定自己的返回值.

这些信息在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)

注意以上getMockPHPUnit_Framework_MockObject_MockBuilder::getMock.(phpunit5.6)

  • setMethods() 也被废弃 (4认同)
  • `setMethods` 已在 PHPUnit 8.x 中弃用,您现在可以使用 `onlyMethods`,更多信息[此处](https://github.com/sebastianbergmann/phpunit/pull/3687)。 (3认同)

Jso*_*owa 6

该方法setMethods已被弃用。现在它可以工作了:

$mock = $this->getMockBuilder(ClassToMock::class)
    ->onlyMethods(['insert', 'update'])
    ->getMock();
Run Code Online (Sandbox Code Playgroud)