代码之家  ›  专栏  ›  技术社区  ›  Racine Pilote

PHPUnit Symfony:如何用多个参数模拟同一个方法?[副本]

  •  1
  • Racine Pilote  · 技术社区  · 6 年前

    我必须将不同的参数传递给getREpository(),但是当我尝试模拟DocumentManager et set Methods getREpository时,我无法使用两个不同的结果模拟该方法。

    我的测试:

    <?php
    
      public function testGetLetter()
        {
            $_box = new Box();
            $_box->setName('test-A');
            $_box->setId('abc01');
            $_boxId = $_box->getId();
            $ids = [];
    
            for ($i = 0; $i < 10; $i++) {
                $letter = new letter();
                $letter->setContent('content: ' . $i);
                $_box->addLetter($letter);
                $letter->setBox($_box);
                $ids[] = $_boxId;
            }
    
            $request = $this->createMock("Symfony\Component\HttpFoundation\Request");
    
            $boxRepository = $this->createMock(BoxRepository::class);
            $boxRepository->expects($this->once())
                ->method('find')
                ->willReturn($_box);
    
            $letterRepo = $this->createMock(LetterRepository::class);
    
    
            $documentManager = $this->getMockBuilder(DocumentManager::class)
                ->disableOriginalConstructor()
                ->setMethods(['getRepository'])
                ->getMock();
    
            $documentManager->expects($this->once())
                ->method('getRepository')
                ->with($this->equalTo('Bundle:Box'))
                ->will($this->returnValue($boxRepository));
    
    
            $documentManager->expects($this->once())
                ->method('getRepository')
                ->with($this->equalTo('Bundle:Letter'))
                ->will($this->returnValue($letterRepo));
    
    
            $boxControler = new boxController();
    
    
            $boxControler->getletters($palletId, $documentManager, $request);
    
        }
    

    public function getletters(string $id, DocumentManager $dm, Request $request): Response
        {
            $box = $dm->getRepository('Bundle:Box')->find($id);
    
            $letters = $box->getLetters();
            $letterRepository = $dm->getRepository('Bundle:Letter');
            $result = [];
            foreach ($letters as $letter){
                $result [] = $letterRepository->prepareLetterData($letter);
            }
            return $this->setResponse($result, $request);
        }
    

    错误:

    Testing Tests\Controller\BoxControllerTest
    
    Expectation failed for method name is equal to "getRepository" when invoked 1 time(s)
    Parameter 0 for invocation DocumentManagerDecorator::getRepository('Bundle:Box') does not match expected value.
    Failed asserting that two strings are equal.
    Expected :'Bundle:Letter'
    Actual   :'Bundle:Box'
     <Click to see difference>
    
     /var/www/html/Controller/BoxController.php:151
     /var/www/html/Tests/Controller/BoxControllerTest.php:147
    

    我看到了 this post 但我不能用我的情况来回应

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ntwobike    6 年前

    你可以用 at()

    $mock->expects($this->at(0))
        ->method('foo')
        ->willReturn('firstValue');
    
    $mock->expects($this->at(1))
        ->method('foo')
        ->willReturn('secondValue');
    

    returnValueMap FROM PHPUnit doc