测试测试方法的参数

时间:2017-05-31 16:22:45

标签: symfony unit-testing testing mocking phpunit

测试具有模拟方法的类的参数是否可能或者好主意? 示例:

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 个答案:

答案 0 :(得分:0)

您无法直接检查,因为正在您正在测试的代码中直接创建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对象。

相关问题