首先,当我注意到在测试中使用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
答案 0 :(得分:1)
尝试
phpunit --configuration filelocation
如果可行,请转到基本路径并执行./vendor/phpunit/phpunit/phpunit
,phpunit.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