【发布时间】:2015-12-28 23:34:38
【问题描述】:
这是我的Person 模型,它的方法中有以下查询:
def get_uniq_person_ids
uniq_person_ids = select('person_id').where(:state => '1').uniq
uniq_person_ids
end
我的测试如下:
def test_uniqueness
Person.delete_all
assert_equal(0, Person.count)
# ..... Adding 8 rows to the database with 2 unique person_id.....
pids = Person.get_uniq_person_ids
assert_equal(pids.size, 2)
end
测试失败并显示以下内容:
失败: 预期但 .
表中有 8 行,但只有 2 个唯一的 person_id。
这是我尝试过的:
-
puts pids断言之前。它只打印 2 个对象。测试失败并显示上述消息。 -
binding.pry就在查询之前。大小为 2,这是预期的,这次测试通过了。
为什么结果如此不一致?是时间问题吗?
注意:我使用 sqlite 作为我的数据库。
【问题讨论】:
-
我不确定您为什么需要测试有关从数据库中擦除“所有数据”的任何内容;如果你需要擦它,擦它。不过,这引出了一个问题,为什么您要手动进行操作。如果不了解您的数据库是如何在测试环境中播种的,就很难说。如果您在测试环境中,这几乎肯定不是“时间”。
-
@DaveNewton 我正在擦除我的测试环境数据库中的所有数据,以便我插入的数据是唯一可用的数据并且计数是可预测的。这只是数据库的预测试设置。
-
对,明白了;我在问你为什么要手动擦除数据——Rails 有已知的擦除数据库的机制。仅供参考,期望值首先出现在 arg 列表中。同样,如果没有更多信息,很难说。如果您的测试是“正常的”,它们也会以随机顺序运行,这意味着之前的测试可能会遗留数据,因为您没有在运行之间以编程方式清理数据库。
-
@DaveNewton 编辑了我的测试,我没有手动删除任何东西。我只是没有显示我认为没有必要清除数据库的那部分代码。
-
您不是手动删除任何内容,而是有清除数据库的代码?这……令人困惑。 (您现在已经显示了手动删除内容的位置。)无论如何。你是如何添加行的?
标签: ruby-on-rails ruby sqlite activerecord