2015-05-21 48 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。它正在通过一些绑定方法来解决。 –