测试方法的测试参数
问题描述:
是否有可能或好主意测试该方法被嘲笑的类的参数? 例子:测试方法的测试参数
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
类的第一个参数是一个字符串,但可我在这个相同的测试中做?
答
由于正在测试的代码中直接创建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
对象。
“用户”的参数是一个合并值或'$ options'中的内容吗?如果你真的需要检查这是一个字符串,可能应该在'User'构造函数中通过参数验证完成检查,然后你可以用phpunit来测试它。 – olibiaz