Использование Экто 2.0:
defmodule PlexServer.BoardInstanceTest do
use PlexServer.ModelCase
alias PlexServer.BoardInstance
@valid_attrs %{board_pieces: [%PlexServer.BoardTileInstance{x: 0, y: 0}], empire: %PlexServer.EmpireInstance{}}
@invalid_attrs %{}
test "changeset with valid attributes" do
changeset = BoardInstance.changeset(%BoardInstance{}, @valid_attrs)
assert changeset.valid?
end
end
defmodule PlexServer.BoardInstance do
use PlexServer.Web, :model
alias PlexServer.BoardTileInstance
schema "board_instances" do
belongs_to :empire, PlexServer.EmpireInstance
has_many :board_pieces, BoardTileInstance
timestamps
end
@required_fields ~w()
@optional_fields ~w()
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> cast_assoc(:board_pieces, required: true)
|> cast_assoc(:empire, require: true)
end
end
Мой тест не работает с
** (RuntimeError) кастинг ассоциаций с cast/3 не поддерживается, вместо этого используйте cast_assoc/3
Глядя на документацию, говорится, что cast_assoc/3 нужно вызывать после cast/3, поэтому я почти уверен, что мне не хватает чего-то важного, чтобы этот тест работал.
Изменить: обновил мой код и теперь получаю новую ошибку:
** (Ecto.CastError) ожидаемые параметры будут картой, получили:
%PlexServer.BoardTileInstance{__meta__: #Ecto.Schema.Metadata<:built>, fleets: #Ecto.Association.NotLoaded<association :fleets is not loaded>, id: nil, inserted_at: nil, system: #Ecto.Association.NotLoaded<association :system is not loaded>, updated_at: nil, x: 0, y: 0}
Я предполагаю, что мои @valid_attrs каким-то образом искажены?
empire
иboard_pieces
из@required_fields
и добавитьcast_assoc
вместо:empire
сrequired: true
. - person Dogbert   schedule 22.06.2016@valid_attrs %{board_pieces: [%{x: 0, y: 0}], empire: %{}}
. - person Dogbert   schedule 22.06.2016