簡體   English   中英

我應該在單元測試中模擬 $this->doSomething() 調用嗎?

[英]Should I mock a $this->doSomething() call in unit testing?

我對測試世界很陌生,我正試圖圍繞嘲笑和嘲弄。 我知道如何模擬正在調用的某些類。 幸運的是,Laravel 使這變得非常容易。

隨着時間的流逝,我了解到您將方法划分為例如 Controller 類成更小的塊。 所以這些較小的方法中的每一個或多或少只做一件事,據我所知,更適合測試。

讓我們假設我的 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測試myMethod並檢查它是否調用其他方法是否是一個好習慣? 我知道這不起作用,但我可以像這樣模擬它嗎? 我應該這樣做嗎?

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

不幸的是,您無法攔截非公共方法。 這是單元測試的一部分,因此它應該可以正常運行。 如果您想攔截該方法中的部分邏輯,您應該考慮將其重構為服務類,然后您可以像這樣調用它:

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

然后你可以模擬它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM