Можно ли не загружать ассоциации после вставки с 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