laravel - 部分模拟一个类而不影响 PHP 中的私有属性
问题描述
我有一个包含很多方法的类,由于 mysql 和内存中的 sqlite 数据库之间的某些 sql 不兼容,我只需要模拟一个方法。
class OrderService implements OrderServiceContract
{
protected $deliveryService;
public function __construct(Delivery $deliveryService) // DI injected object
{
...
$this->deliveryService = $deliveryService;
...
}
public function methodNeedstoBeMocked()
{
....some sql related code...
}
public function returnToWarehouse($orderId)
{
DB::transaction(function() use ($orderId) {
...
$this->deliveryService->someOtherMethod($orderId); // problematic external service call
...
});
}
}
现在在我的测试中,我根据这个文档链接部分地模拟了这个类,我调用了returnToWarehouse
from 测试,但是它说
错误:在 null 上调用成员函数 returnToWarehouse()。
意味着该属性$deliveryService
在模拟中不存在。
我的测试实现如下。
/**
* @test
*/
public function an_order_can_be_returned_to_warehouse()
{
...
...
$this->partialMock(OrderService::class, function ($mock) {
$mock->shouldReceive('methodNeedstoBeMocked')->andReturn(collect([]));
});
$orderService = app(OrderService::class);
$orderService->markOrderReturnedToWarehouse($order->id); // here is the problem gets triggered.
...
//assertions
}
这里可能出了什么问题?有什么方法可以缓解这种情况?提前感谢您的帮助。
解决方案
这里的问题是 Mockery 的部分测试替身不调用原始构造函数。有关更多信息,请阅读此处的文档。
或者,您可以考虑以不同的方式模拟“有问题的”方法。例如,您可以将该逻辑提取到存储库(因为您提到它正在处理数据库层),然后可以在测试期间对其进行模拟。
推荐阅读
- docker - Error w/ installing memcached in Docker alpine image
- php - 在 Laravel 中搜索 where 子句或 Where 子句
- css - p-listbox:搜索过滤器文本框不适合宽度
- python - 安装 JsonGraph 模块时出现编译错误
- javascript - 为什么通过实例调用“get 方法”不需要括号(分组运算符)?
- codeigniter-3 - DOM Input 元素应该具有自动完成属性
- javascript - 通过字符串比较对数组进行排序
- git - Git 找不到项目 URL,尽管它存在并且我有权限
- java - 来自 Restful API 的阅读列表
- python - 由属性确定的唯一数据库条目