phpunit.xml 设置的 sqlite 内存数据库未生效

phpunit.xml 设置的 sqlite 内存数据库未生效,用RefreshDatabase时 重置了我的mysql 数据库,而没有走内存的sqlite数据库,而且post提交时校验了CsrfToken,理论上是不需要校验的,说明我的env没有进入 testing,这是为什么呢?
phpunit.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="DB_CONNECTION" value="sqlite"/>
        <server name="DB_DATABASE" value=":memory:"/>
        <server name="MAIL_DRIVER" value="log"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
    </php>
</phpunit>
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
洛未必达
最佳答案

跟版本是有关系的。例如 Laravel 5.4 中,env()函数是从$_ENV全局变量中获取配置值,与之相对应地,PHPUnit 6 的 phpunit.xml文件会将环境变量存到$_ENV中:

<php>
    <env name="APP_ENV" value="testing"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="QUEUE_DRIVER" value="sync"/>
</php>

以上代码相当于:

$_ENV['APP_ENV'] = 'testing';
$_ENV['CACHE_DRIVER'] = 'array';
$_ENV['SESSION_DRIVER'] = 'array';
$_ENV['QUEUE_DRIVER'] = 'sync';

参见:phpunit.de/manual/6.5/en/appendixe...

但是以课程的 7.x 版本的 env()函数而言,它实际上会同时取$_ENV$_SERVER全局变量里面的环境配置值(详见 env()函数的源码),与之对应的 PHPUnit 8 的 phpunit.xml文件也发生了变化。

参见:phpunit.readthedocs.io/en/9.2/conf...

@

3年前 评论
金头蛮 (楼主) 3年前
讨论数量: 3
洛未必达

请提供下你的开发环境。你可以尝试以下命令运行测试,直接指定环境为testing

$ APP_ENV=testing phpunit

或者指定测试的配置文件:

$ phpunit --configuration phpunit.xml

另外,可以参考这篇文章:Why phpunit is not getting the correct APP_ENV as specified in phpunit.xml?

3年前 评论
金头蛮 (楼主) 3年前

环境:windows laragon 同样的环境,按照课程做的项目时OK的,但是我自己的项目wms就不行,应该是哪个env或者配置项有影响?

基础测试代码

 public function testExample()
    {
        dump(env('APP_ENV'));
        $this->assertEquals('testing', env('APP_ENV'));
    }

失败项目结果:

D:\program\laragon\bin\php\php-7.2.19-Win32-VC15-x64\php.exe E:/www/wms/vendor/phpunit/phpunit/phpunit --configuration E:\www\wms\phpunit.xml --filter Tests\\Unit\\EnvTest --test-suffix EnvTest.php E:\www\wms\tests\Unit --teamcity
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

null

Failed asserting that null matches expected 'testing'.
Expected :testing
Actual   :null
3年前 评论
洛未必达 3年前
金头蛮 (作者) (楼主) 3年前
金头蛮 (作者) (楼主) 3年前
洛未必达

跟版本是有关系的。例如 Laravel 5.4 中,env()函数是从$_ENV全局变量中获取配置值,与之相对应地,PHPUnit 6 的 phpunit.xml文件会将环境变量存到$_ENV中:

<php>
    <env name="APP_ENV" value="testing"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="QUEUE_DRIVER" value="sync"/>
</php>

以上代码相当于:

$_ENV['APP_ENV'] = 'testing';
$_ENV['CACHE_DRIVER'] = 'array';
$_ENV['SESSION_DRIVER'] = 'array';
$_ENV['QUEUE_DRIVER'] = 'sync';

参见:phpunit.de/manual/6.5/en/appendixe...

但是以课程的 7.x 版本的 env()函数而言,它实际上会同时取$_ENV$_SERVER全局变量里面的环境配置值(详见 env()函数的源码),与之对应的 PHPUnit 8 的 phpunit.xml文件也发生了变化。

参见:phpunit.readthedocs.io/en/9.2/conf...

@

3年前 评论
金头蛮 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!