Разрешить выполнение запросов Ecto немедленно в тестовой среде? - PullRequest
0 голосов
/ 31 декабря 2018

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

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Вы тестируете Ecto и ваш драйвер SQL.Вы не должны этого делать, в этом нет никакого смысла.

Единственное, что вы можете здесь проверить (хотя я уверен, что это также избыточно), это заполнение поля inserted_at.

Ecto.Query.order_by/3 работ;если вы не доверяете этому, вам лучше использовать какую-нибудь другую библиотеку.

0 голосов
/ 01 января 2019

Поскольку кажется, что вы пытаетесь протестировать метод get_in_order_of_recency, а не функции datetime вашей базы данных / ecto, вы можете использовать псевдоним <MYPROJ>.Repo, а затем сделать что-то вроде:

Repo.insert!(%People{inserted_at: ~N[2019-01-01 00:00:10], name: "Tidehunter"})
Repo.insert!(%People{inserted_at: ~N[2019-01-01 00:00:11], name: "Kunkka"})
Repo.insert!(%People{inserted_at: ~N[2019-01-01 00:00:12], name: "Windrunner"})

В вашемтестируйте вместо использования интерфейса создания.Это позволит вам проверить, правильно ли ваш метод извлекает людей в нужном вам порядке.

В качестве альтернативы, сочтите сбой теста законным.Ваш желаемый порядок не сохраняется, когда несколько записей вводятся одновременно.В качестве исправления добавьте идентификатор в качестве второго столбца для упорядочения в порядке убывания, что обеспечит соблюдение искомого порядка.

...