У меня есть приложение Phoenix Test со схемой продукта. У меня есть GenServer, запущенный главным супервизором приложения, который получает список продуктов с помощью handle_call.
def handle_call(:get_products, _from, _state)
products = Repo.all(Product)
{:reply, products, products}
end
Теперь я хочу написать тест для этого GenServer.
Я пробовал сделать что-то подобное в тесте
setup do
pid = Process.whereis(MyGenServer)
Ecto.Adapters.SQL.Sandbox.allow(Repo, self(), pid)
ProductFactory.insert_list(3, :product) # using ExMachina for factories
end
Созданы 3 продукта, я могу найти их в тесте с Repo.all (Product), однако запуск MyGenServer.get_products()
вернет пустой массив.
Я не получаю никаких сообщений об ошибках, а просто возвращаю пустой массив, как будто товаров не существует.
Есть ли способ разрешить существующему PID использовать соединение с песочницей оформления заказа и получать мои продукты в процессе GenServer?
PS. Мне удалось запустить тест, перезапустив процесс GenServer в тестовой настройке, но мне было интересно, есть ли более «элегантный» способ решить проблему.
setup do
Supervisor.terminate_child(MyApp.Supervisor, MyGenServer)
Supervisor.restart_child(MyApp.Supervisor, MyGenServer)
ProductFactory.insert_list(3, :product)
end
Спасибо
GenServer
для работы? Почему бы просто не вызвать функцию, чтобы не блокировать каждый запрос кGenServer
. - person Justin Wood   schedule 17.07.2017products = Repo.all(Product)
просто для простого взаимодействия с базой данных. Итак, это вопрос о поведении Ecto Sandbox, а не о результатах GenServer. - person iacobSon   schedule 17.07.2017Ecto.Adapters.SQL.Sandbox.mode(Repo, :manual)
вызывается вtest_helper.exs
? Вы используетеConnCase
илиDataCase
шаблоны из генератора феникса? Вы проводите тесты сasync: true
? В противном случае он должен работать автоматически в:shared
режиме. - person Mike Buhot   schedule 17.07.2017test_helper.exs
с использованием DataCase пробовали как сasync: true
, так и без него, поэтому он не работает в общем режиме , если я не перезапущу процесс, как указано выше. Обратите внимание, что процесс MyGenServer запускается вместе с приложением, поэтому перед::ok = Ecto.Adapters.SQL.Sandbox.checkout(MyApp.Repo)
Все примеры на Ecto Sandbox запускают процессы в тесте, поэтому после процесса владельца (процесс тестирования) - person iacobSon   schedule 17.07.2017