How to test GenServer which accesses to database?

My app has a GenServer module that accesses to database.
But it can’t access to the updateded data on test.
Can this kind of scenario be tested?

defmodule MyGenServer do
  use GenServer

  def start_link(args) do
    GenServer.start_link(__MODULE__, args, name: __MODULE__)
  end

  def init(_args) do
    {:ok, []}
  end

  def list() do
    GenServer.call(__MODULE__, :list)
  end

  def handle_call(:list, _from, state) do
    my_models = MyApp.Repo.all(MyModel)

    {:reply, my_models, state}
  end
end

defmodule MyGenServerTest do
  use ExUnit.Case

  test "test" do
    assert [] = MyGenServer.list()
    
    MyApp.Repo.insert!(%MyModel{field: "good"})

    assert [my_model] = MyGenServer.list() # failed with empty list!
  end
end
1 Like

Any solution for this guys?

My solution would be to run it as:

defmodule MyGenServerTest do
  use ExUnit.Case

  test "test" do
    assert [] = MyGenServer.handle_call(:list, make_ref(), %{})
    
    MyApp.Repo.insert!(%MyModel{field: "good"})

    assert {:reply, [my_model], %{}} = MyGenServer.handle_call(:list, make_ref(), %{})
  end
end
2 Likes