Laravel将哨兵用户注入模型

时间:2015-05-21 08:37:44

标签: laravel testing dependency-injection

我热衷于让我的代码解耦并准备好进行测试。

我有一个Eloquent模型,getBudgetConvertedAttribute依赖于sentry用户属性。

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

测试时抛出此错误,因为Sentry :: getUser返回null。

我的问题是,如何将用户从控制器或服务提供商绑定或测试中注入模型?

2 个答案:

答案 0 :(得分: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();

   }
 }

答案 1 :(得分:0)

为什么不在模型上创建方法,然后将Sentry用户对象作为参数?

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

您需要将type-hint(SentryUser)更改为用户类的实际名称。

如果这是为了帮助测试,你可以在界面上进行一步操作和类型提示(你应该以任何方式),这样你就可以使用模拟用户对象测试你的方法,而不是可能有Eloquent模型所做的其他依赖项的加载,如数据库连接。