2015-05-21 49 views
0

我熱衷於使我的代碼解耦並準備好進行測試。Laravel將哨兵用戶注入模型

我有一個Eloquent模型getBudgetConvertedAttribute取決於sentry用戶屬性。

public function getBudgetConvertedAttribute() 
{ 
    return Sentry::getUser()->currency * $this->budget; 
} 

測試時拋出錯誤,因爲Sentry :: getUser返回null。

我的問題是,我應該如何編碼從控制器或服務提供者綁定或測試中將用戶注入模型?

回答

0

在構造函數中注入$ sentry對象作爲依賴項,而不是使用Sentry Facade。

use Path\To\Sentry; 
class ClassName 
{ 
    protected $sentry 
    public function __construct(Sentry $sentry) 
    { 
     $this->sentry = $sentry; 
    } 

    public function methodName() 
    { 

    $this->sentry->sentryMethod(); 

    } 
} 
+0

我也這麼認爲。但是雄辯模型使用類似靜態方法的外觀。例如。類名::有() - >其中() - > get()方法 - >限制();在這種情況下,它拋出錯誤,說建設期望Sentry,但它通過null。我仍在進一步研究如何使其工作 –

+0

查詢可能有問題。你嘗試dd(Sentry :: getUser() - > currency * $ this-> budget);看到輸出?你得到的錯誤/異常是什麼(如果有的話)? – Ruffles

0

爲什麼不只是在模型創建一個方法,則需要一個哨兵用戶對象作爲參數?

public function getBudgetConverted(SentryUser $user) 
{ 
    return $user->currency * $this->budget; 
} 

你需要的類型提示(SentryUser)更改爲您的用戶類的實際名稱。

如果這是爲了幫助測試,你可以在界面上進行一步和鍵入提示(你應該以任何方式),這樣你可以用模擬用戶對象測試你的方法,而不是一個可能有一些其他的依賴關係,比如數據庫連接,Eloquent模型會這樣做。

+0

對不起,我正在使用Laravel 4不支持方法注入。對於雄辯的屬性,我不直接調用這個函數。但用$ model-> budgetConverted;這將解決這個功能。 –

+0

我也在一些項目上工作Laravel 5,我知道接口代碼的概念,但是如何在測試環境中嘲笑用戶呢?正如我所說的,我不會調用該方法並自己傳入$ user。它正在通過一些綁定方法來解決。 –