伪造移民的最好方法是什么?我有一个大的数据库表,在那里我需要删除重复项,并在同一个事务中添加唯一的索引。这是解决这一问题的最安全和最简单的方法。但一旦完成,我的测试就开始失败。在迁移中没有提到唯一的索引。所以当我测试唯一的约束时,它就失败了。
我认为解决这个问题的最好方法是制造一个假迁移。不会做任何事情的迁移只会为测试添加唯一的索引。我可以删除唯一的测试,但我不喜欢这种方法。这也不能解决测试和生产数据库之间的不一致问题。
发布于 2022-03-10 21:33:57
您的索引设置为DEFERRABLE INITIALLY DEFERRED吗?
然后,您的测试将失败,因为它在沙箱(单个事务)中运行,因此不会触发违禁品。
你可以通过跑步来避开它
Repo.query!("SET CONSTRAINTS ALL IMMEDIATE", [])在测试开始的时候。
发布于 2022-03-18 19:17:45
你不想做“假装”的移民。您的数据库结构应该在各种环境中都是统一的。如果您没有这种安全性,那么您的测试是不可靠的,弊大于利。
在不知道哪些测试实际上失败的情况下,很难说出确切的问题是什么,但您提到:
因此,当我测试唯一约束时,它就失败了。
对我来说,我认为这意味着测试套件没有相同的迁移头或一般的数据库结构,这两个数据库都应该读取相同的索引,并且您不希望在不同的环境之间改变结构。
我会删除测试数据库并创建/迁移数据结构。请记住,如果要这样做,则需要包装任何希望数据库中包含数据的迁移代码,如下所示:
unless Mix.env() in [:test] do
# code expecting data to be in database
end这样,您的测试套件将具有与其他环境相同的结构,并且您将不会遇到从空数据库获取数据的问题。
https://stackoverflow.com/questions/71425776
复制相似问题