我正在遵循Hartl的Rails教程并使用Rails6。我不断遇到持续出现的错误,这些错误似乎在每次运行测试时都会随机出现-随机出现是因为连续的测试有时会指示不同区域的错误。这些测试也非常慢-有时> 30分钟。有人遇到过这个吗?我可能做错了什么?现在是红色鲱鱼:我正在使用Win 8.1:)
关于这些错误消息的共同点是它们都包含“ RuntimeErroer:数据库已锁定”消息。这是其中之一:
ERROR["test_email_validation_should_reject_invalid_addresses",
#<Minitest::Reporters::Suite:0x000000000c9b29c0 @name="UserTest">, 608.7059665989946]
test_email_validation_should_reject_invalid_addresses#UserTest (608.71s)
RuntimeError: RuntimeError: database is locked
答案 0 :(得分:0)
这是我面临的挑战之一的解决方案-极慢的测试速度。在config / database.yml中,我向test.sqlite部分添加了以下几行:
database: db/test.sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 3000
测试持续时间从几分钟缩短至几秒钟。胜利!
但是,“ RuntimeError:数据库已锁定”消息仍然存在。
答案 1 :(得分:0)
我一直在同一个错误上作斗争。实际上情况非常糟糕,以至于阻碍了我在Hartl的Rails教程中真正前进。
编辑:找到了一个更好的答案,可以简单地解决问题,而不用玩我可能不太了解的设置。
请参阅-> https://stackoverflow.com/a/62730905/10463184
作为Windows用户,我唯一的贡献是发现在test / test_help.rb中注释掉了整行...
parallelize(workers: :number_of_processors, with: :threads)
解决了问题。尝试在链接上建议的设置会导致出现“需要UNIXServer(LoadError)”错误。
答案 2 :(得分:0)
在Windows中,您可以尝试使用该程序http://www.nirsoft.net/utils/opened_files_view.html来确定进程正在处理db文件。尝试关闭该程序以解锁数据库
在Linux和macOS中,您可以执行类似的操作,例如,如果锁定的文件是development.db:
$热熔器development.db
此命令将显示什么进程正在锁定文件:
> development.db:5430
杀死进程...
杀死-9 5430
...然后您的数据库将被解锁。
或
这应该是数据库的内部问题... 对我来说,它已经尝试使用“ SQLite管理器”浏览数据库后显现出来。 因此,如果找不到另一个连接到数据库的进程而又无法修复它,请尝试以下根本解决方案:
提供导出表的功能(可以在Firefox上使用“ SQLite管理器”) 如果迁移更改了数据库方案,请删除上一次失败的迁移 重命名您的“ database.sqlite”文件 执行“ rake db:migrate”以创建新的工作数据库 提供对数据库进行表导入的正确权限 导入备份表 编写新的迁移 使用“ rake db:migrate”执行它
答案 3 :(得分:0)
我发现自己处于同样的情况。
在我的例子中,发生这个错误是因为测试默认在 MiniTest 上并行运行,这意味着它们也在 rails 中并行运行。当发生这种情况并且有测试在测试数据库上进行事务时,数据库会锁定自身,从而导致错误。
对我有用的解决方案是在测试类中将属性“use_transactional_tests”设置为 false。
您可以在 docs 中看到正确的用法和示例。