我只是在使用Laravel 5.1学习PHPUnit。我正在使用“使用DatabaseMigrations”来为我在phpunit.xml中设置的每个测试迁移测试数据库:
<php>
...
<env name="DB_DATABASE" value="project_test"/>
...
</php>
我在设置实例化,工厂等时设置了一堆基本测试,但是我想在UserModel中检查一个访问器和一个mutator:
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
public function getPasswordAttribute($password)
{
$this->attributes[ 'password' ] = bcrypt($password);
}
但是当访问者测试运行时:
/**
* A basic check of full name accessor.
*
* @return void
*/
public function testCheckFullNameOfUser()
{
$user = User::all();
$this->assertEquals($user->first_name . ' ' . $user->last_name, $user->fullname);
}
我收到此错误:
1) UserTest::testCheckFullNameOfUser
ErrorException: Trying to get property of non-object
这似乎表明数据库尚未迁移,并且已连接到Homestead并登录到MySQL并检查迁移表,测试数据库为空,没有发生迁移。
我在文档中错过了哪些工作?我可以通过重用用户工厂来完成它,但我不明白为什么我无法访问测试数据库,是否需要最初迁移?
答案 0 :(得分:1)
您收到该错误是因为您的数据库中没有任何用户。
首先,当tests Laravel中的use DatabaseMigrations
继续进行并在每次测试之前运行迁移并执行&#34;回滚&#34;每次测试后。这样,每个测试都有一个新的数据库,一次测试的剩余数据不会影响后续测试。
这意味着如果您的某个测试期望数据库中有用户,那么您需要在该测试中创建它们。这也解释了为什么在您查看测试数据库时没有任何数据。
其次,User::all()
会返回collection个用户。如果您想要单个用户,请尝试使用User::first()
。
试试这个测试:
public function testCheckFullNameOfUser()
{
User::create(['first_name'=>'John', 'last_name'=>'Smith']);
$user = User::first();
$this->assertEquals('John Smith', $user->fullname);
}