【问题标题】:Laravel - Tests on MySQL databaseLaravel - MySQL 数据库测试
【发布时间】:2018-04-07 14:15:15
【问题描述】:

我正在学习 Laravel 和功能测试。 在 laracast 我们有 phpunit.xml:

<php>
        <env name="DB_CONNECTION" value="sqlite"/>
        <env name="DB_DATABASE" value=":memory:"/>
</php>

我无法在 mysql 数据库上进行测试,因为当我将 DB_CONNECTION 参数切换到“mysql”时,出现错误“PDOException: SQLSTATE[HY000] [1049] Unknown database ':memory:'”。

当我不使用内存时,所有表都会从我的数据库中删除:
我的测试类看起来像这样:

class ThreadsTest extends TestCase
{

    use DatabaseMigrations;

    /** @test */
    public function a_user_can_browse_threads()
    {
        $response = $this->get('/threads');
        $response->assertStatus(200);
    }
}

有人知道如何使用 MySQL 在内存中进行测试吗? 我找不到任何信息

【问题讨论】:

    标签: php mysql laravel testing


    【解决方案1】:

    您可以使用单独的数据库运行

        <env name="DB_CONNECTION" value="mysql"/>
        <env name="DB_HOST" value="localhost"/>
        <env name="DB_DATABASE" value="test"/>
        <env name="DB_USERNAME" value="root" />
        <env name="DB_PASSWORD" value="" />
    

    【讨论】:

      【解决方案2】:

      这是不可能的。您不能像使用 SQLite 那样将 MySQL 作为内存数据库运行。

      【讨论】:

      • 那么我们如何在 MySQL 上进行测试呢?运行测试后删除所有表。在 MySQL 数据库上测试的正确方法是什么?
      • 你的系统上安装了 MySQL 吗?
      • 是的。仅 MySQL (XAMPP)
      • 为您的测试创建一个单独的数据库并将其添加到phpunit.xml。您可以将测试包装在事务中以回滚更改:laravel.com/docs/5.6/…
      • 为 MySQL 编写的应用程序并不总是可以与 SQLite 一起使用,因为缺少数据库功能。即便如此,使用 SQLite 进行测试也不能替代使用生产环境的 DBMS 进行测试。
      【解决方案3】:

      只需更改参数

      <php>
          <env name="DB_CONNECTION" value="sqlite"/>
          <env name="DB_DATABASE" value=":memory:"/>
      </php>
      

      <php>
          <env name="DB_CONNECTION" value="mysql"/>
          <env name="DB_DATABASE" value="your_test_instance"/>
      </php>
      

      【讨论】:

        猜你喜欢
        • 2014-09-03
        • 2018-08-20
        • 1970-01-01
        • 2023-03-28
        • 2021-07-19
        • 2014-12-19
        • 2017-04-12
        • 2017-09-26
        • 1970-01-01
        相关资源
        最近更新 更多