[英]Mocking Laravel Model::increment() with Mockery
我在Laravel 5事件處理程序中有一行代碼,如下所示:
$this->event->batch->increment('attempted_jobs');
$this->event
是調用處理程序的事件, $this->event->batch
包含我的Batch
模型。 所有這些都會增加我的數據庫中的attempted_jobs
列,所以這是相當基本的東西。
我希望能夠測試這個事件處理程序,我正在使用Codeception和Mockery。 我對$this->event->batch
模擬看起來像這樣:
$batch = m::mock('MyVendor\MyApp\Batch');
$batch->shouldReceive('increment')->once()->with('attempted_jobs');
然而,這會導致問題 - increment()
是Model
的受保護方法,因此無法進行Model
。 這是確切的錯誤:
InvalidArgumentException: increment() cannot be mocked as it a protected method and mocking protected methods is not allowed for this mock
它似乎是使用__call()
PHP魔術方法實現的,那么如何模擬這個呢? 我試圖創建一個__call()
模擬,但這會產生大量與increment()
方法無關的錯誤。
問題是因為,如上所述, increment()
是Illuminate\\Database\\Eloquent\\Model()
的受保護方法。 解決這個問題的方法是直接模擬__call()
方法,如下所示:
$batch = m::mock('MyVendor\MyApp\Batch');
$batch->shouldReceive('__call')->with('increment')->once();
(我不知道為什么當我第一次嘗試時這不起作用)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.