测试方法的测试参数

测试方法的测试参数

问题描述:

是否有可能或好主意测试该方法被嘲笑的类的参数? 例子:测试方法的测试参数

class CarType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder->addEventSubscriber(new User('argument example') 

    } 
} 

这是我的测试:

public function testFormBuilder() 
    { 

    $builder = $this->getMockBuilder('Symfony\Component\Form\FormBuilder') 
     ->disableOriginalConstructor() 
     ->getMock(); 

     // Test  
     $type = new CarType(); 

      $this->builder->expects($this->once()) 
       ->method('addEventSubscriber') 
       ->with(
        $this->isInstanceOf(User::class) 
       ); 

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


    } 

这个测试做工精细,但是... 我想知道,如果User类的第一个参数是一个字符串,但可我在这个相同的测试中做?

+1

“用户”的参数是一个合并值或'$ options'中的内容吗?如果你真的需要检查这是一个字符串,可能应该在'User'构造函数中通过参数验证完成检查,然后你可以用phpunit来测试它。 – olibiaz

由于正在测试的代码中直接创建User,因此无法直接进行检查。

但是具体取决于该字符串可以通过User类的公共方法来检索,那么你可以做这样的事情:

$this->builder->expects($this->once()) 
      ->method('addEventSubscriber') 
      ->with(
       $this->callback(function($user) { 
        if (! $user instanceof User) { 
         return False; 
        } 

        if ($user->getName() != <Expected String>) { 
         return False; 
        } 

        return True; 
       }) 
      ); 

可以使用User实例的回调检查进一步的细节。您不验证该字符串是否传递给构造函数,但可以检查该对象是否已正确创建。

虽然这不是最好的解决方法。您的代码不可扩展,因为您无法更改User类。将User对象传递给传递的方法会更好。这将允许您将来有不同类型的User对象。