【问题标题】:Laravel 5.1 PHPUnit with "use DatabaseMigrations;" Produces Error when Accessing Test DBLaravel 5.1 PHPUnit 与“使用 DatabaseMigrations;”访问测试数据库时产生错误
【发布时间】:2015-09-07 04:50:53
【问题描述】:

我只是在使用 Laravel 5.1 学习 PHPUnit。我正在使用“使用 DatabaseMigrations”为每个测试迁移测试数据库,我在 phpunit.xml 中设置了这些数据库:

<php>
    ...
    <env name="DB_DATABASE" value="project_test"/>
    ...
</php>

在检查实例化、工厂等时,我已经设置了一堆基本测试,但我想检查 UserModel 中的访问器和修改器:

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

这似乎表明数据库尚未迁移,通过 SSH 进入 Homestead 并登录 MySQL 并检查迁移表,测试数据库为空,似乎没有发生迁移。

为了完成这项工作,我在文档中遗漏了什么?重用用户工厂就可以通过,但是不明白为什么不能访问测试数据库,是不是需要初始迁移?

【问题讨论】:

    标签: php laravel phpunit laravel-5.1


    【解决方案1】:

    您收到该错误是因为您的数据库中没有任何用户。

    首先,当你 use DatabaseMigrations 在你的 tests 中时,Laravel 继续并在每次测试之前运行你的迁移,并在每次测试之后执行“回滚”。这样一来,您就可以为每个测试创建一个新数据库,并且一个测试的剩余数据不会影响后续测试。

    这意味着如果您的某个测试预计数据库中有用户,那么您需要在该测试中创建它们。这也解释了为什么您查看时测试数据库中没有任何数据。

    其次,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);
    }
    

    【讨论】:

    • 啊,明白了,谢谢。我在脑海中想到迁移包括播种,所以我期待我的种子存在。感谢您的解释和建议,非常有帮助。
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 2015-10-04
    • 2015-09-26
    • 2015-08-25
    • 2016-11-28
    • 1970-01-01
    • 2015-11-02
    • 2016-01-31
    相关资源
    最近更新 更多