2016-06-09 43 views
0

我掙扎嘲笑query_builder選項在我的Symfony形式的測試,我已經使用m:on(function() {})但無濟於事試過......模擬的Symfony表「query_builder」與嘲弄

這裏有一個例子是我「M努力實現:

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 

class MyCustomForm extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $userToken = 'this will be a TokenInterface object'; 

     $builder->add('field1', EntityType::class, [ 
      'label' => 'My Label', 
      'class' => 'AppBundle:MyClass', 
      'query_builder' => function (MyClassRepository $repository) use ($userToken) { 
       return $repository->setUserToken($userToken)->orderBy('alias.column_1'); 
     ]); 
    } 
} 

我想要做的就是測試的setUserTokenorderBy方法被調用的嘲笑對象。

namespace tests\Unit\AppBundle\Form; 

class MyCustomFormTest extends \PHPUnit_Framework_TestCase 
{ 
    // Setup test class etc... 

    public function testBuildingTheForm() 
    { 
     $this->builder->shouldReceive('add') 
      ->once() 
      ->with('field1', EntityType::class, [ 
       'label'   => 'My Label', 
       'class'   => 'AppBundle:MyClass', 
       'query_builder' => m::on(function ($closure) use ($userToken) { 
        // Test calls 
        // Test a mock method call with($userToken) 

        return true; 
       }, 
      ]); 

     $this->testClass->buildForm($this->builder, []); 
    } 
} 

下面是我收到的錯誤:

1) Tests\Unit\AppBundle\Form\MyCustomFormTest::testBuildingTheForm 
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Mockery_0_IteratorAggregate_Symfony_Component_Form_FormBuilderInterface::add("field1", "Symfony\Bridge\Doctrine\Form\Type\EntityType", array('label'=>'My Label','class'=>'AppBundle:MyClass','query_builder'=>'object(Closure)',)). Either the method was unexpected or its arguments matched no expected argument list for this method 

回答

0

感謝戴夫馬歇爾,我想出了一個解決方案!

測試類:

namespace tests\Unit\AppBundle\Form; 

class MyCustomFormTest extends \PHPUnit_Framework_TestCase 
{ 
    // Setup test class etc... 

    public function testBuildingTheForm() 
    { 
     $this->builder->shouldReceive('add') 
      ->once() 
      ->with('field1', EntityType::class, m::on(function ($options) use ($userToken) { 
       $this->assertSame('My Label',   $options['label']); 
       $this->assertSame('AppBundle:MyClass', $options['class']); 

       $mockRepository = m::mock('AppBundle\Repository\ MyClassRepository'); 
       $mockRepository->shouldReceive('setUserToken')->with($userToken)->once()->andReturnSelf(); 
       $mockRepository->shouldReceive('orderBy')->with('alias.column_1', 'ASC')->once()->andReturnSelf(); 

       $options['query_builder']($mockRepository); 

       return true; 
      })); 

     $this->testClass->buildForm($this->builder, []); 
    } 
} 
2

你不能嵌入Mockery::on喜歡,所以你需要把它的水平,這樣的事情:

public function testBuildingTheForm() 
{ 
    $this->builder->shouldReceive('add') 
     ->once() 
     ->with('field1', EntityType::class, m::on(function ($options) use ($userToken) { 
      $this->assertEquals('My Label', $options['label']; 
      $this->assertEquals('AppBundle:MyClass', $options['class']; 

      // whatever you need to test with $options['query_builder'] 

      return true; 
     })); 

    $this->testClass->buildForm($this->builder, []); 
}