Laravel 5.1 无法 运行 测试用户密码修改器
Laravel 5.1 Unable to Run Test on User Password Mutator
我有一个密码修改器:
/**
* Mutator for setting the encryption on the user password.
*
* @param $password
*/
public function getPasswordAttribute($password)
{
$this->attributes[ 'password' ] = bcrypt($password);
}
我正在尝试测试:
/**
* A basic check of password mutator.
*
* @return void
*/
public function testCheckPasswordEncryptionUserAttribute()
{
$userFactory = factory('Project\User')->create([
'password' => 'test'
]);
$user = User::first();
$this->assertEquals(bcrypt('test'), $user->password);
}
当测试运行时我得到这个错误:
1) UserTest::testCheckPasswordEncryptionUserAttribute
Failed asserting that null matches expected 'y$iS278efxpv3Pi6rfu4/1eOoVkn4EYN1mFF98scSf2m2WUhrH2kVW6'.
测试失败后,我尝试 dd() 密码 属性,但也失败了。我的第一个想法是这可能是一个批量分配问题(刚刚读过),但密码在 $fillable 中(这很有意义,它会在那里),然后我注意到 $hidden in the User class 作为好吧,但是在阅读了文档中的相关内容并删除了 $hidden 的密码索引之后,当您尝试访问密码 属性 时,它仍然会产生一个空值。
你将如何对这个修改器进行单元测试,或者我错过了什么?
您只需将方法名称中的 "get" 更改为 "set"。
以"get"开头的方法是访问器。这些不应该更改字段/属性值,而是 return 一个 "mutated" 值(你的 return 没什么,这就是你得到 null
的原因)。
以 "set" 开头的方法旨在更改字段(增变器)的值,这似乎正是您所需要的。
http://laravel.com/docs/5.0/eloquent#accessors-and-mutators
/**
* Mutator for setting the encryption on the user password.
*
* @param $password
*/
public function setPasswordAttribute($password)
{
$this->attributes['password'] = bcrypt($password);
}
您可以隐藏"password",因为这不会影响您的测试。
P.S。如果我没记错的话,factory('...')->create()
returns 是一个新创建模型的实例 (\Illuminate\Database\Eloquent\Model
),所以你不必做 User::first()
:
/**
* A basic check of password mutator.
*
* @return void
*/
public function testCheckPasswordEncryptionUserAttribute()
{
$user = factory('Project\User')->create(['password' => 'test']);
$this->assertTrue(Hash::check('test', $user->password));
}
我有一个密码修改器:
/**
* Mutator for setting the encryption on the user password.
*
* @param $password
*/
public function getPasswordAttribute($password)
{
$this->attributes[ 'password' ] = bcrypt($password);
}
我正在尝试测试:
/**
* A basic check of password mutator.
*
* @return void
*/
public function testCheckPasswordEncryptionUserAttribute()
{
$userFactory = factory('Project\User')->create([
'password' => 'test'
]);
$user = User::first();
$this->assertEquals(bcrypt('test'), $user->password);
}
当测试运行时我得到这个错误:
1) UserTest::testCheckPasswordEncryptionUserAttribute
Failed asserting that null matches expected 'y$iS278efxpv3Pi6rfu4/1eOoVkn4EYN1mFF98scSf2m2WUhrH2kVW6'.
测试失败后,我尝试 dd() 密码 属性,但也失败了。我的第一个想法是这可能是一个批量分配问题(刚刚读过),但密码在 $fillable 中(这很有意义,它会在那里),然后我注意到 $hidden in the User class 作为好吧,但是在阅读了文档中的相关内容并删除了 $hidden 的密码索引之后,当您尝试访问密码 属性 时,它仍然会产生一个空值。
你将如何对这个修改器进行单元测试,或者我错过了什么?
您只需将方法名称中的 "get" 更改为 "set"。
以"get"开头的方法是访问器。这些不应该更改字段/属性值,而是 return 一个 "mutated" 值(你的 return 没什么,这就是你得到 null
的原因)。
以 "set" 开头的方法旨在更改字段(增变器)的值,这似乎正是您所需要的。
http://laravel.com/docs/5.0/eloquent#accessors-and-mutators
/**
* Mutator for setting the encryption on the user password.
*
* @param $password
*/
public function setPasswordAttribute($password)
{
$this->attributes['password'] = bcrypt($password);
}
您可以隐藏"password",因为这不会影响您的测试。
P.S。如果我没记错的话,factory('...')->create()
returns 是一个新创建模型的实例 (\Illuminate\Database\Eloquent\Model
),所以你不必做 User::first()
:
/**
* A basic check of password mutator.
*
* @return void
*/
public function testCheckPasswordEncryptionUserAttribute()
{
$user = factory('Project\User')->create(['password' => 'test']);
$this->assertTrue(Hash::check('test', $user->password));
}