【问题标题】:Mock Symfony Form 'query_builder' with Mockery用 Mockery 模拟 Symfony 表单 'query_builder'
【发布时间】:2016-10-09 23:42:12
【问题描述】:

我正在努力在 Symfony 表单测试中模拟 query_builder 选项,我尝试使用 m:on(function () {}) 但无济于事...

这是我想要实现的一个示例:

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

【问题讨论】:

    标签: php unit-testing symfony mockery


    【解决方案1】:

    你不能像那样嵌入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, []);
    }
    

    【讨论】:

      【解决方案2】:

      感谢 Dave Marshall,我想出了一个解决方案!

      测试类:

      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, []);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-08-16
        • 2018-03-26
        • 2015-03-27
        • 2014-11-05
        • 2022-01-04
        • 2016-08-17
        • 2020-05-10
        • 1970-01-01
        • 2013-09-30
        相关资源
        最近更新 更多