PHPUnit样机问题

时间:2016-12-21 11:50:14

标签: php mocking phpunit

我有一个服务类的模型。 它在我的setUp函数

中定义如下
$this->myServiceMockup = $this->getMockBuilder(MyService::class)
            ->disableOriginalConstructor()
            ->setMethods(['myMethod'])
            ->getMock();

在我的测试功能中,我为此设定了一个期望。

$this->myServiceMockup->expects($this->once())
            ->method('myMethod')
            ->with($this->exactly(1), 'myName')
            ->willReturn($this->exactly(1));

所以这意味着当我只触发myMethod函数一次并且它将返回整数1时。

所以我测试的方法都有这行代码。

$myIntValue = $this->myService->myMethod($number, $name);

在此行$myIntValue之后,当我运行测试时应该是1并且测试应该继续,以及我对此的理解。

但我得到了这个错误

  

方法名称的期望失败等于何时   调用1次(s)参数0用于调用

     

我的\ Path \ To \ Class \ MyService :: myMethod(1,' myName')不匹配   期望值。

     

1与预期类型不匹配"对象"。

没有任何意义,因为myMethod期待一个整数和一个字符串。

public function myMethod($number, $name)
{
    return $this->table->save($number, $name);
}

有人可以向我解释我在这里做错了什么,因为我没有想法。

2 个答案:

答案 0 :(得分:2)

exactly()是一个调用计数匹配器(如once()any()),用作expects()方法的参数。

只需替换:

->with($this->exactly(1), 'myName')

->with(1, 'myName')

willReturn()也会“按原样”接受值。

答案 1 :(得分:2)

您没有正确使用$this->with

$this->myServiceMockup
    ->expects($this->once())
    ->method('myMethod')
    ->with($this->equalTo(1), $this->stringContains('myName'))
    ->willReturn(1);