我有一个密码更改器:
/**
* 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 '$2y$10$iS278efxpv3Pi6rfu4/1eOoVkn4EYN1mFF98scSf2m2WUhrH2kVW6'.
测试失败后,我尝试了dd()密码属性,但也失败了。我的第一个想法是这可能是一个批量分配问题(刚刚读过这个),但密码是$ fillable(这是有意义的,它会在那里),然后我注意到$隐藏在User类中,但之后阅读文档中的内容,并删除$ hidden的密码索引,当您尝试访问密码属性时仍会产生null。
你如何对这个变异器进行单元测试,或者我错过了什么?
答案 0 :(得分:3)
你只需要改变"得到"到"设置"在您的方法名称中。
以" get"开头的方法是访问者。这些不应该改变字段/属性值,而是返回一个" mutated"价值(你的回报没有“你得到null
的原因。”
以" set"开头的方法旨在改变字段(mutators)的值,这似乎正是你所需要的。
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);
}
你可以制作"密码"隐藏,因为这不会影响你的考试。
P.S。如果我没有错,factory('...')->create()
会返回新创建的模型的实例(\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));
}