Можно ли не загружать ассоциации после вставки с ExMachina?

Я использую ex_machina для создания прибора для моих юнит-тестов.

Я сохраняю некоторые записи в базе данных, используя ExMachina insert(:comment) но мои утверждения неверны, потому что ExMachina всегда загружает отношения, и это не тот случай, когда я беру с Ecto и не звоню Repo.preload,

Допустим, у меня есть 2 фабрики comment а также user:

def user_factory do
  %User{
    name: "some name"
  }
end

def comment_factory do
  %Comment{
    content: "some content",
    user: build(:user)
  }
end

когда я тестирую

  test "should retrieve last comment" do
    comment = fixture(:comment)
    assert Comment.get_last_comment() == comment
  end

Утверждение в случае неудачи, потому что слева у меня есть

%Comment{
    ...,
    content: "some content",
    user: #Ecto.Association.NotLoaded<association :user is not loaded>
}

и справа

%Comment{
    ...,
    content: "some content",
    user: %User{ name: "some name" }
}

Я пытаюсь избежать:

  • с помощью Repo.preload на моей левой записи, потому что иногда есть довольно много зависимостей

  • тестирование каждого свойства в отдельности

Заранее спасибо за вашу помощь

1 ответ

Я решил эту проблему, определив equal_records функция в test/support/data_case.ex это просто сравнивает тип структур и идентификаторы записей:

def equal_records(%{__struct__: t1, id: id1}, %{__struct__: t2, id: id2}) do
  t1 == t2 and id1 == id2
end

def equal_records(_, _), do: false

Использование:

test "should retrieve last comment" do
  comment = fixture(:comment)
  assert equal_records(Comment.get_last_comment(), comment)
end

Чтобы также проверить списки записей, добавьте также следующие функции:

def equal_records([], []), do: true
def equal_records([h1 | t1], [h2 | t2]) do
  equal_records(h1, h2) and equal_records(t1, t2)
end
Другие вопросы по тегам