Я хотел бы написать тесты для проверки того, что запросы 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)
, давая мне отдельные поля inserted_at
(таким образом, название вопроса), но рискуя XYпроблема Я открыт для других предложений.Спасибо!