【发布时间】:2020-10-03 13:58:57
【问题描述】:
我有一个包含很多方法的类,由于 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
...
});
}
}
现在在我的测试中,我根据this doc link 部分模拟了这个类,我从测试中调用了returnToWarehouse,然后它说
错误:在 null 上调用成员函数 returnToWarehouse()。
表示属性 $deliveryService 在 mock 上不存在。
我的测试实现如下。
/**
* @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
}
这里可能出了什么问题?有什么方法可以缓解这种情况?提前感谢您的帮助。
【问题讨论】:
标签: laravel mocking phpunit mockery