测试具有模拟方法的类的参数是否可能或者好主意? 示例:
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
类的第一个参数是否是一个字符串,但我可以在同一个测试中进行吗?
答案 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
对象。