【发布时间】:2026-01-27 13:40:01
【问题描述】:
创建模拟类通常涉及在模拟/测试替身上配置方法调用预期。
例如在“香草”PHPUnit 中,我们可以存根方法调用并设置期望值,如下所示:
$stub->expects($this->any())->method('doSomething')->willReturn('foo');
在Mockery模拟对象框架中,我们得到这样的API:
$mock->shouldReceive('doIt')->with(m::anyOf('this','that'))->andReturn($this->getSomething());
像这样的期望通常在测试套件的设置阶段被连接起来,例如\PHPUnit_Framework_TestCase的setUp()方法。
如果不能满足上述期望,就会破坏测试。因此,使期望成为实际的断言。
这导致我们的断言(断言 + 期望)分散在测试用例类周围,因为我们最终在测试用例的设置阶段以及单个测试中都有实际的断言。
在“常规”assert.. 方法中测试方法调用预期是否是一种好习惯。这可能看起来像这样(嘲笑):
public function setUp()
{
$mock = m::mock(SomeClass::class);
$mock->shouldReceive('setSomeValue');
$this->mock = $mock;
}
以及稍后在其中一种测试方法结束时:
public function testSoemthing()
{
...
$this->assertMethodCalled($this->mock, 'setSomeValue');
}
assertMethodCalled 不是 PHPUnit 公开的方法。它必须实施。
简而言之,我们是否应该将期望声明视为实际断言,然后在我们的测试方法中对其进行测试?
【问题讨论】:
标签: unit-testing phpunit mockery