2016-09-21 41 views
2

我對測試世界相當陌生,我試圖圍繞嘲笑和嘲諷。我知道如何嘲笑某些被調用的類。幸運的是,Laravel使這非常簡單。

一段時間以來,我瞭解到您將您的方法(例如Controller類)劃分爲更小的塊。所以每個這樣的小方法或多或少只會做一件事,就像我聽說的那樣,測試更好。

讓我們假設我的控制器類看起來是這樣的:

class MyController extends Controller 
{ 
    public function myMethod($request) 
    { 
    $this->validateRequest($request); 
    $response = App\ModelClass::doSomething(); 
    return response()->json($response) 
    } 

    protected function validateRequest($request) 
    { 
    // do some validation here 
    } 
} 

據我瞭解,單元測試是用來檢查隔離的方法和我應該在儘可能少塊地劃分代碼,使其更容易測試它們(所以一種方法只做一件事等)

是不是很好的做法,在這個例子中,測試myMethod,並檢查它是否調用其他方法?我知道這不起作用,但我可以像這樣嘲笑它嗎?我應該這樣做嗎?

\Mockery::mock('App\Http\Controllers\MyController') 
    ->shouldReceive('validateRequest') 
    ->once(); 

回答

1

不幸的是,你不能攔截未公開的方法。這是單元測試的一部分,所以它應該正常運行。如果你想攔截你應該想想重構到服務類方法中的一個邏輯的一部分,那麼你可以這樣調用:

public function myMethod($request) 
{ 
    app(RequestService::class)->validateRequest($request); 
    $response = App\ModelClass::doSomething(); 
    return response()->json($response) 
} 

那麼你可以嘲笑它想:

App::shouldReceive('make->validateRequest') (...) 
+0

謝謝,這整個事情流露出一些光=) 我現在也發現一些信息,通常應該不是單元測試laravel控制器。他們應該通過http調用,然後作爲一個整體執行。我想我只需要使用它的功能測試,並測試它作爲一個整體調用的控制器和成員函數。幸運的是,我仍然可以嘲笑像你解釋的每一個服務類。 – Chris

相關問題