调用模拟对象的方法

时间:2015-06-10 13:11:34

标签: php unit-testing symfony phpunit

我正在使用PHPUnit测试服务。

我正在使用setUp()来创建我的服务接受的依赖项的模拟对象,如下所示:

 public function setUp()
    {
        $this->fooManagerMock = $this->getFooManagerMock();
        $this->barManagerMock = $this->getBarManagerMock();
        $this->treeManagerMock = $this->getTreeManagerMock();
        $this->loggerMock = $this->getLoggerMock();

     $this->myService = new MyService($this->fooManagerMock, $this->barManagerMock, $this->treeManagerMock, $this->loggerMock);
    }

捆绑\测试\服务\ MyTest的:: testServiceWithValidData

   /**
     * @dataProvider getServiceValidCaseData
     */
    public function testServiceWithValidData($case)
    {
         $this->assertTrue($this->myService->serve($fooArray));
    }

事实证明,在我serve()函数中的实体经理,我有这样的事情:

return $this->fooManager->find($fooId) !== null;

在这种情况下,$ this-> fooManager是Mock_FooManager_4038382a的实例,整个测试失败。

任何建议都非常受欢迎。

更新

/**
     * @return \PHPUnit_Framework_MockObject_MockBuilder
     */
    private function getFooManagerMock()
    {
        return $this->getMockBuilder(
            '\MyBundle\Entity\Manager\FooManager'
        )->disableOriginalConstructor()->getMock();
    }

@matteo的示例

我希望$fooManager->find($id)能够返回一个特定的Foo实例,例如:

\MyBundle\Manager\FooManager{
"id" : 234234,
"status" : "pending".
"color" : "yellow",
"tree" : [
         "id" : 2345,
         "height" :160
       ]
}

1 个答案:

答案 0 :(得分:2)

您必须在测试用例中指定模拟实体必须执行的操作,尝试在调用测试服务之前在testServiceWithValidData方法中添加此代码:

       $fooMockObj = $this->getMock('\MyBundle\Entity\Foo');
       // Eventually mock some method
       // PS You can return a concrete instance too
       // $fooMockObj= new  \MyBundle\Entity\Foo();

        $this->fooManager
            ->expects($this->any())
            ->method('find')
//            ->with($anOptionalInputId)
             ->will($this->returnValue($fooMockObj));

希望这个帮助