【问题标题】:Rails can't find record in db (but actual it exists)Rails 在 db 中找不到记录(但实际存在)
【发布时间】:2017-05-15 01:37:32
【问题描述】:

例如,我正在 DB 中搜索 Model.find_by(slug: :name)。它在本地环境中工作正常,但在测试中它给了我零。 (我查了三次,db里有记录)。

我什至添加了调试来查看日志。当我执行Model.where(slug: :name).count 时,它返回 0。但是记录确实存在这个 slug 名称。

我该去哪里解决这个问题?

【问题讨论】:

  • 您检查以确保开发和测试数据库相同?
  • “我检查了三次,db 中有记录” 检查了你的测试数据库或开发数据库,​​因为它们通常是默认和设计上的独立数据库跨度>
  • 不,没有。但我检查了请求的记录是否存在。例如,我添加了调试器:使用“request.slug”,它返回给我'管理',我进入测试服务器数据库并找到带有 slug '管理'的记录。所以记录存在。
  • Ofc,我正在检查测试数据库。不是我的本地人!
  • 你在使用任何测试框架吗?

标签: mysql ruby-on-rails ruby activerecord


【解决方案1】:

运行测试时,Rails 使用不同的数据库。通用约定是 projectname_development 与 projectname_test(最后是 projectname_production)。

通常的测试系统也会在运行测试之前清除测试数据库。这有两个原因:

  • 您不想通过测试弄乱您的开发数据库。许多开发人员让他们的测试在开发过程中连续运行。
  • 您编写的每个测试都应该为自己工作,独立于周围的数据。

您必须为每个测试设置测试数据。你没有提到你使用什么测试系统。

看看FixturesFactory Girl

【讨论】:

  • 我很抱歉,但不是这样。我知道这件事。我要说的是'如果记录实际上存在于数据库中,在模型表中,Model.find_by(slug: :name) 怎么可能返回 nil。
【解决方案2】:

测试数据库中存储的数据是临时的,测试结束后会被删除。 开发数据库独立于测试数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多