运行测试时无法使Laravel更改数据库

时间:2019-09-16 11:56:56

标签: php laravel testing

首先,当我注意到在测试中使用RefreshDatabase特征时,我的问题就开始了。它迁移了我的整个开发数据库,​​清除了所有内容!我不知道那是不是它的工作方式,但是我需要我的数据库才能在本地运行我的应用程序并对其进行手动测试。

然后我尝试仅将sqlite用于测试。首先,我将此行添加到phpunit.xml

<server name="DB_CONNECTION" value="sqlite"/>

但是没有用。运行测试仍然刷新了mysql数据库。

然后我尝试添加一个.env.testing文件,并将DB_CONNECTION更改为sqlite

它不再起作用。

然后我在一项测试中将此行添加到setUp

dd(env('DB_CONNECTION', 'mysql'), config('database.default'));

phpunit.xml中拥有数据库时的结果:

PHPUnit 7.5.16 by Sebastian Bergmann and contributors.

"sqlite"
"mysql"

拥有.env.testing时的结果:

PHPUnit 7.5.16 by Sebastian Bergmann and contributors.

"mysql"
"mysql"

我有什么办法可以尝试找出发生这种情况的原因?

Laravel:Laravel框架5.8.35

PHP:PHP 7.3.7

5 个答案:

答案 0 :(得分:1)

尝试

phpunit --configuration filelocation

如果可行,请转到基本路径并执行./vendor/phpunit/phpunit/phpunitphpunit.xml必须位于基本路径。

祝你好运

答案 1 :(得分:0)

将环境设置为http://localhost:8080?page=3&size=5 ,并使用内存中的sqlite数据库在testing中进行测试

phpunit.xml

答案 2 :(得分:0)

真是一团糟!

大量搜索 后,我发现有人建议Error : WARNING: You are using deprecated Main class. Please use io.cucumber.core.cli.Main Exception in thread "main" java.lang.NoClassDefFoundError: gherkin/IGherkinDialectProvider at io.cucumber.core.options.CommandlineOptionsParser.parse(CommandlineOptionsParser.java:24) at io.cucumber.core.options.CommandlineOptionsParser.parse(CommandlineOptionsParser.java:29) at io.cucumber.core.cli.Main.run(Main.java:29) at cucumber.api.cli.Main.run(Main.java:28) at cucumber.api.cli.Main.main(Main.java:15) Caused by: java.lang.ClassNotFoundException: gherkin.IGherkinDialectProvider at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 5 more Process finished with exit code 1 并成功了!

但是在那之后,我的应用程序完全使用了测试环境!

然后我尝试了php artisan config:cache --env=testing并成功了!

我的问题解决了,但是真是一团糟。如果有人可以提供解释或好的解决方案,我仍然会接受另一个答案。

答案 3 :(得分:0)

.env.testing中放置一个先前未使用的新变量将测试是否正在使用它,或者是否使用了另一个和/或缓存的配置。

问题可能是您同时使用开发环境进行开发和测试,因此一旦缓存了一个.env文件,便会设置bootstrap/cache/config.php直到清除配置缓存。

解决方案是隔离用于测试的工作副本。

实际上,并非每个项目都针对每个环境都理想地设置了Docker容器或VM,或者有时您只是想快速启动测试

如果您要为两者使用相同的工作副本,建议您不要缓存路由或配置。

答案 4 :(得分:0)

试试

<块引用>

php 工匠配置:清除

这会阻止laravel缓存配置,phpunit.xml可以重写.env soo