2015-01-07 115 views
1

我正在測試我的api。在呼叫路線之前,我將用戶登錄到應用程序。 問題是,在路由調用中,用戶的身份驗證沒有被分配給Auth::id()Laravel單元測試從認證測試中調用路由

下面是這種情況:

測試方法:

public function testApiGetOrder() 
{ 
    var_dump($this->user); // first dump 
    Auth::login($this->user); // Can't use $this->be($this->user) here, it would not help anyway... 
    var_dump(Auth::id()); // second dump 

    $response = $this->call('GET', '/order/' . $this->order->getKey()); 

    $this->assertResponseOk(); 
    $this->assertJson($response->getContent()); 
    $this->assertJsonStringEqualsJsonString($this->order->toJson(), $response->getContent()); 
} 

OrderController的方法:的testApiGetOrder的

public function show($id) 
{ 
    var_dump(Auth::id()); // third dump 
    var_dump(Auth::user()->getKey()); // fourth dump 

    // Calling model's logic here 
} 

輸出:

首先轉儲:object(User)
二轉儲:int(1)
三轉儲:NULL
四轉儲:int(1)

爲什麼用戶的id的值不分配給Auth::id()

+0

因爲你還沒有登錄第三次轉儲? –

+0

嘗試切換第三個和第四個轉儲的順序。如果我的懷疑是正確的,我會寫一個擴展的答案,爲什麼會發生這種情況。 – DouglasDC3

+0

結果如我所願。第三次轉儲:int(1),第四次轉儲:NULL。 現在,第三次轉儲= var_dump(Auth :: user() - > getKey())。 第四次轉儲= var_dump(Auth :: id())。 – user2694295

回答

2

你不是在談論同一個Auth實例。

在你測試你有,你在,因此你找回數據記錄驗證庫的一個實例。 當您打電話時,控制器擁有自己的身份驗證實例(在Laravel框架內運行)

更清晰的創建您的測試的方法是使用Auth庫的模擬。它由Laravel進行測試,並且在單元測試期間您要測試最小的一段代碼。

public function testApiGetOrder() 
{ 
    Auth::shouldReceive('id')->with($this->user->getKey()) 
          ->once()->andReturn($this->user); 

    Auth::shouldReceive('user')->once()->andReturn($this->user); 

    $response = $this->call('GET', '/order/' . $this->order->getKey()); 

    $this->assertResponseOk(); 
    $this->assertJson($response->getContent()); 
    $this->assertJsonStringEqualsJsonString($this->order->toJson(), $response->getContent()); 
} 
+0

問題是,Auth :: id()不直接在控制器的方法中調用。我使用查詢範圍來根據用戶的ID從數據庫中過濾訂單。範圍從模型的方法調用,所以我認爲Mockery不會捕獲任何Auth :: id()調用...? 嘲笑後得到Mockery NoMatchingExpectationException認證...這裏是一個如何得到槽這種方式? – user2694295

+1

模擬模型,您不在您的控制器中測試您的模型。您需要驗證您的控制器在模型上調用了所需的方法。而已。 – DouglasDC3