我想编写测试来验证我的应用程序中的 SQL 查询返回的数据是否符合某些约束:即返回值以插入降序排列。在应用程序中,我timestamps()
在我的模式中使用将一个inserted_at
字段包含到数据库中,并在我的查询 ( SELECT … ORDER BY inserted_at DESC
) 中对其进行查询。
我的问题出现在我的测试中:如果我有类似的测试代码
person1_params = %{name: "Tidehunter"}
{:ok, tidehunter} = People.create_person(person1_params)
person2_params = %{name: "Kunkka"}
{:ok, kunkka} = People.create_person(person2_params)
person3_params = %{name: "Windrunner"}
{:ok, windrunner} = People.create_person(person3_params)
我想断言他们的订单,比如
people = People.get_in_order_of_recency()
assert Enum.at(people, 0).name == "Windrunner"
这失败了,即使在手动测试中这一切似乎都有效。经过检查,我发现inserted_at
所有三个记录都是相同的。我尝试添加:timer.sleep()
调用,但它不会改变结果,这表明 Ecto/Postgrex 层存在一些批处理或惰性。
我能想到的“最简单”的解决方案是某种方式来“强制”在呼叫站点进行交易,所以我可以:timer.sleep(1)
在它们之间,给我不同的字段(因此是问题标题)但有XY 问题inserted_at
的风险我我愿意接受其他建议。谢谢!