Laravel-PHPUnit沒辦法Mock物件

Laravel專案中寫測試,遇到怎樣都沒辦法Mock其他物件,原因可能是這個物件早就被實現了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class ComboCategoryServiceTest extends TestCase
{
private $combo;
private $service;

public function setUp()
{
parent::setUp();
$this->combo = factory(ComboCategory::class)->create(['id' => 1]);
$this->service = app()->make(\App\Services\ComboCategoryService::class);
}

public function testSearchByFrontForCombo()
{
$mockHotel = Mockery::mock(\App\Repositories\HotelRepository::class);
$this->app->instance(\App\Repositories\HotelRepository::class, $mockHotel);
$mockHotel->shouldReceive('findByDomainOrFail')
->andReturn((object)['id' => 2])
->once();

//Mock其他物件之後,再make 一次
// $this->service = app()->make(ComboCategoryService::class);

$inputs = [
'domain' => get_domain(),
'combo_category' => $this->combo->id
];

$result = $this->service->searchByFrontForCombo($inputs);
$this->assertEquals($this->combo->id, $result->first()->id);
}
}

這個function會呼叫findByDomainOrFail,但是在這裡執行的時候,其實他都沒有被Mock

這是因為早在setUp早就實現ComboCategoryService:class,此建構子又實現HotelRepository::class

在這之後怎麼Mock,instance都沒有用。

結論:要在呼叫之前就Mock,instance,或是再實現一次方法。

1
$this->service = app()->make(ComboCategoryService::class);