ExMachina"嵌套"构建



所以我是长生不老药的新手,但我找不到关于这方面的信息,我真的不理解这个问题。

比方说:

%Restaurant{} has many %Discount{}
%Discount{} has many %PromoCode{}

工厂:

def restaurant_factory do
%Restaurant{ 
discounts: [ 
build(:discount)
] 
}
end 
def discount_factory do
%Discount{
promo_codes: [
build(:promo_code)
]
}
end 
def promo_code_factory do
%PromoCode{}
end

但当我跑步时:

test "" do
r = insert(:restaurant)
end 

我得到:**(ArgumentError(预期变更集数据为%Discount结构,得到:%PromoCode

所以我不能有"嵌套"构建?或者其他什么不对劲?

实现我想要的目标的正确方式是什么创建餐厅,创建与餐厅相关的折扣,并创建与折扣相关的促销代码?

完全错误:

1) test load discount by promo code (Restaurants.Domain.LoadDiscountsServiceTest)
test/services/load_discounts/service_test.exs:42
** (ArgumentError) expected changeset data to be a Elixir.Restaurants.Domain.Models.Discount struct, got: %Res
taurants.Domain.Models.PromoCode{__meta__: #Ecto.Schema.Metadata<:built, "promo_codes">, code: "XXYY6Z", created_at
: nil, discounts: #Ecto.Association.NotLoaded<association :discounts is not loaded>, discounts_id: nil, id: nil, up
dated_at: nil, use_limit: 3}
stacktrace:
(ecto) lib/ecto/changeset/relation.ex:190: Ecto.Changeset.Relation.assert_changeset_struct!/2
(ecto) lib/ecto/changeset/relation.ex:148: Ecto.Changeset.Relation.do_change/4
(ecto) lib/ecto/changeset/relation.ex:312: Ecto.Changeset.Relation.map_changes/8
(ecto) lib/ecto/repo/schema.ex:597: anonymous fn/4 in Ecto.Repo.Schema.surface_changes/3
(elixir) lib/enum.ex:1925: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/repo/schema.ex:584: Ecto.Repo.Schema.surface_changes/3
(ecto) lib/ecto/repo/schema.ex:189: Ecto.Repo.Schema.do_insert/4
(ecto) lib/ecto/association.ex:556: Ecto.Association.Has.on_repo_change/4
(ecto) lib/ecto/association.ex:338: anonymous fn/7 in Ecto.Association.on_repo_change/6
(elixir) lib/enum.ex:1925: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/association.ex:335: Ecto.Association.on_repo_change/6
(elixir) lib/enum.ex:1925: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/association.ex:301: Ecto.Association.on_repo_change/3
(ecto) lib/ecto/repo/schema.ex:708: Ecto.Repo.Schema.process_children/4
(ecto) lib/ecto/repo/schema.ex:774: anonymous fn/3 in Ecto.Repo.Schema.wrap_in_transaction/6
(ecto) lib/ecto/adapters/sql.ex:576: anonymous fn/3 in Ecto.Adapters.SQL.do_transaction/3
(db_connection) lib/db_connection.ex:1283: DBConnection.transaction_run/4
(db_connection) lib/db_connection.ex:1207: DBConnection.run_begin/3
(db_connection) lib/db_connection.ex:798: DBConnection.transaction/3
(ecto) lib/ecto/repo/schema.ex:125: Ecto.Repo.Schema.insert!/4

我用运行测试

iex -S mix test --trace test/services/load_discounts/service_test.exs:42

42是该特定测试开始的线路

我的关联是错误的,在%折扣中我有:

has_many(:promo_codes, Discount)

我本应该:has_many(:promo_codes, PromoCode)

尴尬!真抱歉!

最新更新