模拟测试对象的公共方法


Mocking public method of testing object

我有一个有两个公共方法的类。它看起来像下面这样:

class IntRequest
{
    public function updateStatus()
    {
        $isValid = $this->checkValidity();
        // ... next is a complex logic that use $isValid
    }
    /**
     * @return bool
     */
    public function isValid()
    {
        // another complex logic
    }
}

我需要测试第一个函数 - IntRequesr::updateStatus ; 但是我需要运行测试。第一个带有 IntRequests::isValid 返回false,第二个返回true

,由于IntRequests::isValid

我尝试模拟该函数,但测试运行时调用实际IntRequests::isValid而不是模拟函数。

我的测试代码是

$intRequest = new IntRequests;
$mock = m::mock($intRequest);
$mock->shouldReceive('isValid')
    ->once()
    ->andReturn(true);
$res = $mock->updateStatus();
$this->assertTrue($res);

我试着打电话给$res = $intRequest->updateStatus()而不是$res = $mock->updateStatus()但没有运气。

所以,我想知道是否可以模拟称为内部测试方法的功能?

你需要一个部分模拟(一个模拟对象,其中一些方法被存根,而其余的保持原样)。由于我只对 phpunit 自己的模拟库进行了此操作,因此我只能向您指出文档,但似乎您应该在模拟实例中添加->makePartial()