Ell*_*son 8 elixir ecto phoenix-framework
我正试图在Elixir中测试一个属于该关联的人.
假设我有两个型号,一个产品和一个ProductType.产品属于产品类型.
defmodule Store.Product do
use Store.Web, :model
schema "products" do
field :name, :string
belongs_to :type, Store.ProductType, foreign_key: :product_type_id
timestamps
end
@required_fields ~w(name product_type_id)
@optional_fields ~w()
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
defmodule Store.ProductType do
use Store.Web, :model
schema "product_types" do
field :name, :string
timestamps
end
@required_fields ~w(name)
@optional_fields ~w()
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
Run Code Online (Sandbox Code Playgroud)
这是我在测试文件中的内容:
defmodule Store.ProductTest do
use Store.ModelCase
alias Store.Repo
alias Store.Product
alias Store.ProductType
@valid_attrs %{
name: "pickles",
product_type_id: 42,
}
@invalid_attrs %{}
test "product type relationship" do
product_type_changeset = ProductType.changeset(
%ProductType{}, %{name: "Foo"}
)
product_type = Repo.insert!(product_type_changeset)
product_changeset = Product.changeset(
%Product{}, %{@valid_attrs | product_type_id: product_type.id}
)
product = Repo.insert!(product_changeset)
product = Product |> Repo.get(product.id) |> Repo.preload(:type)
assert product_type == product.type
end
end
Run Code Online (Sandbox Code Playgroud)
我基本上是创建产品类型,创建产品,从数据库中获取产品记录并验证类型与我创建的类型相同.
这是一种合理的方法吗?
为了后人的缘故,这里是一个更清洁的测试,不使用变更集:
test "belongs to product type" do
product_type = Repo.insert!(%ProductType{})
product = Repo.insert!(%Product{product_type_id: product_type.id})
product = Product |> Repo.get(product.id) |> Repo.preload(:type)
assert product_type == product.type
end
Run Code Online (Sandbox Code Playgroud)
要测试此关联,您可以基本上放弃转换和验证.
我根本不会明确地测试这个 - 你基本上是在这里测试 Ecto。
我通常在例如控制器测试中隐式测试这种事情,您在其中发布一些内容,然后确保在数据库中创建了正确的数据。
如果您想对此进行单元测试,您需要考虑到底要比较什么。测试插入的产品类型的 id 是否与插入的产品的 Product_type_id 相同应该足够了,但这感觉很奇怪,因为这样更明显的是您只是在这里测试 ecto 功能。