gpt4 book ai didi

unit-testing - Yii2 ActiveRecord 用 Mockery 进行模拟

转载 作者:行者123 更新时间:2023-12-03 02:45:04 24 4
gpt4 key购买 nike

我正在运行 phpunit 并进行模拟(没有数据库/夹具),但我在模拟模型时遇到了麻烦。

$customer = Mockery::mock(CustomerModel::class);
echo $customer->id;

产生错误:

BadMethodCallException:此模拟对象上不存在方法 Mockery_1_models_Customer::hasAttribute()

然后我尝试了:

$customer->shouldReceive('hasAttribute')->andReturn(true);

但是,我再次遇到:

fatal error :在第 135 行对 ..\yiisoft\yii2\db\ActiveRecord.php 中的非对象调用成员函数 getDb()

有什么建议吗?

最佳答案

我知道您不接受固定答案,但我也无法弄清楚。我试图解决的问题实际上是模拟模型中的某些方法,以避免创建底层装置。

所以我最终在 Mockery 中使用Proxy 模式实现

private $_product;
public function testMe()
{
// Here we use fixtured instance of Product model to build a Proxy
$this->_product = \Mockery::mock($this->product('product1'));
// somehow model attributes are inaccessible via proxy, but we can set them directly as a Proxy property
$this->_product->id = 1;
$this->_product->shouldReceive('getPrice')->andReturn(1000);
// assertions below
...
}

在此示例中,Product 模型中的 getPrice() 方法返回相关表中的 Product 价格。我们在这里模拟它,这样我们就不必用所有相关的模型装置填充数据库。尽管如此,产品本身仍然是一个固定装置。

也许不是最好的解决方案,但设法节省了我一些 CPU 时间,同时保持单元测试解耦。

文档在这里 http://docs.mockery.io/en/latest/reference/partial_mocks.html

更新:

我还做了一个小助手来解决属性代理问题

/**
* @param \yii\base\Model $model
* @return \Mockery\MockInterface
*/
private function setupMock($model)
{
$mock = \Mockery::mock($model);
foreach ($model->getAttributes() as $key => $value) {
$mock->$key = $value;
}
return $mock;
}

这样,原始模型中的所有属性及其相应的值都可以在模拟中使用。

关于unit-testing - Yii2 ActiveRecord 用 Mockery 进行模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31205770/

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