gpt4 book ai didi

php - 使用 phpunit 创建模拟类?

转载 作者:可可西里 更新时间:2023-10-31 22:12:28 24 4
gpt4 key购买 nike

有没有办法用 phpunit 创建模拟类,而不是模拟对象?我正在寻找一种方法来进行依赖注入(inject),而不必在构造函数(或任何地方)中显式传递类可能需要使用的每个对象。对于所有这些情况都会返回“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”方法绑定(bind)到它。

我正在使用 phpunit 3.7.5。

最佳答案

我怀疑您实际上并不想这样做(因为您可以使用 PHPUnit 的 mockbuilder 禁用构造函数等,请参阅 the docs ),但假设您确实想要或需要这样做,这应该可以解决问题:

$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's reflection capabilities .它不是目前最强大的反射库,但它非常好。我用它来生成有关类的必需字段和可选字段的元信息,这些元信息基于类的构造函数参数和“模型”库的属性,其中该元信息用于生成接受正确类型值的表单。也就是说,生成类型化的表单时没有表单所针对的类的实例,并且无需手写大量愚蠢的代码——整个功能总共大约 100 行。显然我不知道你想做什么,但从你帖子中的少量信息来看,我猜它更接近于那种元事物。

关于php - 使用 phpunit 创建模拟类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13389449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com