PHPUnit Laravel Hash不可用

时间:2016-12-30 12:14:59

标签: php laravel phpunit laravel-facade

我在Laravel中进行了单元测试,用于测试看起来像这样的API调用,但运行时遇到以下运行时错误:

RuntimeException: A facade root has not been set.

我在setup方法中创建了一个用户,打算在tearDown()方法中再次删除它,然后运行我的auth测试。

首先,有没有更好的方法来做我想要的?例如,在不触及数据库的情况下模拟用户?其次,我如何设置一个立面根源'或者那个错误究竟意味着什么?为了创建一个Dummy用户,我试图不打算对该特定字段进行散列,但是错误似乎转移到了模型,其中(再次)使用了Hash外观类。

是否还有其他步骤来设置环境,以便这些外观可以用于测试?

提前致谢。

use Illuminate\Support\Facades\Hash;

/*
* Make sure the structure of the API call is sound.
*/
public function testAuthenticateFailed()
{

  $this->json('POST', $this->endpoint,
        [ 'email' => 'test@test.com',
          'password' => 'password',
        ])
         ->seeJsonStructure([
             'token'
  ]);

}

//create a user if they don't already exist.
public function setup()
{
  $user = User::create([
      'company_id' => 9999,
      'name'=>'testUser',
      'email' => 'test@test.com',
      'password' => 'password',
      'hashed_email' => Hash:make('test@test.com'),
  ]);
}

2 个答案:

答案 0 :(得分:9)

尝试使用此代码:

\Hash::make('test@test.com'),

使用bcrypt()全球助手而不是Hash::make()

是个好主意

另外,将此添加到setUp()方法:

parent::setUp();

答案 1 :(得分:-1)

  1. 您可以使用Laravel附带的DatabaseMigrationsDatabaseTransactions特征,因此您无需手动删除用户。

  2. 您可以在您的User类中添加一个Mutator,它会在创建用户时自动散列密码。

  3. 
    
        // https://laravel.com/docs/5.3/eloquent-mutators
    
        public function setPasswordAttribute($value) {
            $this->attributes['password'] = bcrypt($value);
        }