如何使无效属性测试通过零允许或必需属性

How do I make an invalid attributes test pass with zero allowed or required attributes

我正在使用 Ecto 2.0 使这个测试通过:

defmodule PlexServer.FleetInstanceTest do
  use PlexServer.ModelCase

  alias PlexServer.FleetInstance

  @invalid_attrs %{some_random_data: "random data"}

  test "changeset with invalid attributes" do
    changeset = FleetInstance.changeset(%FleetInstance{}, @invalid_attrs)
    refute changeset.valid?
  end
end

这是模型

defmodule PlexServer.FleetInstance do
  use PlexServer.Web, :model

  schema "fleet_instances" do
    has_many :ship_instance, PlexServer.ShipInstance

    timestamps
  end

  def changeset(model, params \ %{}) do
    model
      |> cast(params, [])
      |> validate_required([])
  end
end

似乎强制转换忽略了任何不在允许列表中的数据,因此变更集被认为是有效的,测试失败。

是的,Ecto.Changeset.cast/3 将忽略第三个参数中未指定的任何字段,并且当您将 [] 传递给 validate_required 时,确实不可能 params将使您当前版本的 PlexServer.FleetInstance.changeset/2 return valid?: false.