有没有办法使用 phpunit 创建模拟类,而不是模拟对象?我正在寻找一种方法来进行依赖项注入,而不必显式传递类可能需要在构造函数(或任何地方)中使用的每个对象。对于所有这些情况都会返回“true”:
public function testAAAA()
{
$foo = $this->getMock('foo', array('bar'));
var_dump(class_exists('foo', false));
var_dump(method_exists('foo', 'bar'));
var_dump(method_exists($foo, 'bar'));
}
这打印:
bool(true)
bool(false)
bool(true)
表明虽然它确实成功创建了一个假的“foo”类,但它没有将“bar”方法绑定到它。
我正在使用 phpunit 3.7.5。
我怀疑您实际上并不想这样做(因为您可以使用 PHPUnit 的模拟构建器禁用构造函数等,请参阅the docs http://www.phpunit.de/manual/current/en/test-doubles.html#test-doubles.mock-objects),但假设您确实想要或需要,这应该可以解决问题:
$foo = $this->getMockBuilder('nonexistant')
->setMockClassName('foo')
->setMethods(array('bar'))
->getMock();
var_dump(class_exists('foo', false));
var_dump(method_exists('foo', 'bar'));
var_dump(method_exists($foo, 'bar'));
$cls = new ReflectionClass('foo');
var_dump($cls->hasMethod('bar'));
老实说,我不确定为什么需要在上面指定不同的名称(不存在和 foo),但这似乎与 PHPUnit 在被模拟的类尚不存在时的行为有关,并且让 setMockClassName 生成一个类扩展该类。或者其他的东西。它可能有效地解决了错误/边缘情况——这是该库的奇怪用法。您应该能够通过getMock
单独功能,它只是更丑陋。
顺便说一句,听起来你应该熟悉一下php的反射能力 http://www.php.net/manual/en/book.reflection.php。它不是最强大的反射库,但它非常好。我使用它根据“模型”库的构造函数参数和属性生成有关类的必填字段和可选字段的元信息,其中该元信息用于生成接受正确类型值的表单。也就是说,生成类型化表单,无需表单所属类的实例,也无需手写大量愚蠢的代码——整个功能总共大约有 100 行。显然我不知道你想做什么,但从你帖子中的少量信息来看,我猜它更接近于那种类型的元事物。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)