在PHPUnit中是否有与SimpleTest的“部分模拟”等效的?

2022-08-30 13:04:50

我正在尝试将一堆测试从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");
    }
}

答案 1

通过阅读链接的页面,SimpleTest 部分模拟似乎是一个模拟,其中只有部分方法被覆盖。如果这是正确的,则该功能由普通的 PHPUnit 模拟处理。

在 里面,您可以创建一个模拟PHPUnit_Framework_TestCase

$mock = $this->getMock('Class_To_Mock');

这将创建一个模拟实例,其中所有方法都不执行任何操作并返回 null。如果只想重写某些方法,则 第二个参数是要重写的方法数组。getMock

$mock = $this->getMock('Class_To_Mock', array('insert', 'update'));

将创建一个删除了 和 函数的模拟实例,准备指定其返回值。Class_To_Mockinsertupdate

此信息位于 phpunit 文档中

请注意,对于从 5.4 开始的 PHPUnit 版本,此答案显示了更多最新的代码示例


答案 2

PHPUnit_Framework_TestCase::getMock 自 phpunit 5.4 起被弃用。我们可以改用。setMethods

setMethods(array $methods) 可以在 Mock Builder 对象上调用,以指定要替换为可配置测试替身的方法。其他方法的行为不会更改。如果调用 setMethods(null),则不会替换任何方法。

https://phpunit.de/manual/current/en/test-doubles.html

$observer = $this->getMockBuilder(Observer::class)
                 ->setMethods(['update'])
                 ->getMock();

请注意,以上是 。(phpunit5.6)getMockPHPUnit_Framework_MockObject_MockBuilder::getMock


推荐