PHPunit:如何模拟具有参数和返回值的方法

时间:2012-03-02 01:50:44

标签: php unit-testing phpunit

使用PHPUnit,我想知道我们是否可以模拟一个对象来测试是否使用期望参数调用方法,返回值?

doc中,有一些示例包含传递参数或返回值,但不包含 ...

我试过用这个:

// My object to test
$hoard = new Hoard();
// Mock objects used as parameters
$item = $this->getMock('Item');
$user = $this->getMock('User', array('removeItem'));
...
$user->expects($this->once())
     ->method('removeItem')
     ->with($this->equalTo($item));
$this->assertTrue($hoard->removeItemFromUser($item, $user));

我的断言失败因为Hoard :: removeItemFromUser()应该返回User :: removeItem()的返回值,这是真的。

$user->expects($this->once())
     ->method('removeItem')
     ->with($this->equalTo($item), $this->returnValue(true));
$this->assertTrue($hoard->removeItemFromUser($item, $user));

还失败并显示以下消息:“调用的参数计数User :: removeItem(Mock_Item_767aa2db Object(...))太低。

$user->expects($this->once())
     ->method('removeItem')
     ->with($this->equalTo($item))
     ->with($this->returnValue(true));
$this->assertTrue($hoard->removeItemFromUser($item, $user));

还失败并显示以下消息:“ PHPUnit_Framework_Exception:参数匹配器已定义,无法重新定义

我该怎么做才能正确测试这种方法。

2 个答案:

答案 0 :(得分:21)

will和朋友需要使用with代替returnValue

$user->expects($this->once())
     ->method('removeItem')
     ->with($item)  // equalTo() is the default; save some keystrokes
     ->will($this->returnValue(true));    // <-- will instead of with
$this->assertTrue($hoard->removeItemFromUser($item, $user));

答案 1 :(得分:0)

我知道这是一篇过时的文章,但是它在搜索PHPUnit警告时位于顶部。方法名称匹配器已经定义,无法重新定义,所以我也将回答。

还有其他原因产生这种警告消息。如果您在像这样的链接方法中描述模拟行为:

StartWeekNum = Application.WorksheetFunction.WeekNum(StartDate, 21)
EndWeekNum = Application.WorksheetFunction.WeekNum(EndDate, 21)

您将收到警告方法名称匹配器已定义,无法重新定义。只需将其拆分为单独的语句,警告就会消失(在PHPUnit 7.5和8.3上进行了测试)。

$research = $this->createMock(Research::class);
$research->expects($this->any())
    ->method('getId')
    ->willReturn(1)
    ->method('getAgent')
    ->willReturn(1);