【问题标题】:Calling a method of a mock object调用模拟对象的方法
【发布时间】:2015-06-10 13:11:34
【问题描述】:

我正在使用 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);
    }

Bundle\Tests\Service\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
       ]
}

【问题讨论】:

  • 能否提供getFooManagerMock 方法的代码?
  • 从提供的详细信息中不清楚您的问题是什么。 “整个测试失败”是如何表现出来的?您的模拟 FooManager 是否提供了 find() 的实现,该实现在传递 $fooId 时返回合理的内容?
  • @Matteo 我刚刚更新了我的初始帖子。 @redbirdo 我的 FooManager 包含一个 find($id) method,其中包含:return $this->getRepository()->find($id); 希望有所帮助。

标签: php unit-testing symfony phpunit


【解决方案1】:

您必须在测试用例中指定模拟实体必须执行的行为,尝试在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));

希望有帮助

【讨论】:

  • 感谢您的回答。这是以前尝试过并且有效的东西,但是 事情是我的find($id) 我期待收到一个 Foo 实例,然后使用它。 $foo = $this->fooManager->find($id); $foo->getStatus();
  • 当然,您可以模拟一个Foo 类,然后在模拟的期望方法中返回它,而不是true 值。如果您需要示例代码,请告诉我
  • 如果你愿意,你也可以返回一个具体的对象实例
  • 我明白你的意思,我对此有点怀疑。问题是预期的实例是一个巨大的对象,包含对象,在某些情况下包含对象的对象,并且模拟它可能需要 500 行代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 2016-06-08
  • 1970-01-01
  • 2023-01-03
  • 2013-09-12
  • 2010-09-25
相关资源
最近更新 更多