我正試圖測驗我的代碼的一個特定部分,但是模型類的一些依賴性使得這個測驗很難執行。如果這些依賴關系是在一個被注入的類上,我可以很容易地模擬這個類。當它來自一個工廠的資料庫關系時,是否可以做類似的事情?我把這個想法轉換為Laravel檔案中的例子, 試圖讓它更容易被示范 :
use AppModelsPost。
use AppModelsUser;
$user = User::factory()
->有(Post::factory()->count(3)
->創建()。
假設我正在測驗一個控制器,它將為一個用戶的帖子創建評論。我將使用一個工廠來創建用戶和帖子,并對路由/api/comments進行測驗,這個帖子有post_id(int)和comment(text)欄位。 然而,評論控制器將呼叫一個方法Post::canAddComment(),它將執行大量的驗證,以驗證評論是否可以被創建。所有這些驗證都不在我的測驗范圍內。
是否可以使用Post模型類的Mock,這樣我就可以做,例如:
$postMock-> shouldReceive('canAddComment')->once()->andReturn(true)。
這樣我就不需要創建一個完整的場景來進行測驗了嗎?
可能的解決方案:
擴展 Post 類。
擴展Post類,僅用于測驗:
擴展Post類,僅用于測驗。
class PostThatAlwaysAllowsComments extends Post
{
public function canAddComment(){
return true;
}
然后在測驗中:
use AppModelsPost。
use AppModelsUser;
$user = User::factory()
->有(PostThatAlwaysAllowsComments::factory()->count(3)
->創建()。
uj5u.com熱心網友回復:
在Laravel中, 嘲弄模型并不是一個真正的標準,或者說都不方便。大多數時候,你安排資料,讓模型做模型的事。在你的案例中,你可以利用一個包裝器/代理的方法,來輕松地模擬你的呼叫。這也將作為嘲諷的入口,因為你需要容器中的一個類來被嘲諷。
class PostThatAlwaysAllowsComments extends Post
{
public function canAddComment() {
resolve(CommentService::class)->comment($this) 。
}
這里使用了resolve作為從容器中獲取服務的方法,因為new關鍵字將不起作用。
現在使用Laravels模擬語法糖,你可以模擬底層服務,避免觸發你不關心的代碼,并斷言它確實被呼叫。
namespace TestsUnit。
use AppServicesCommentService;
使用 MockeryMockInterface。
use TestsTestCase;
class PostAddComentTest extends TestCase
{
public function testDoWork()
{
$post = //用工廠創建你的模型;{
$mock = $this->mock(CommentService:: class, function (MockInterface $mock) {
$mock->shouldReceive(' comment')
->一次()
->andReturn(true)。
});
//呼叫api或方法。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/310314.html
標籤:
下一篇:如何使用存盤界面來洗掉一個檔案
