【问题标题】:How do I make an invalid attributes test pass with zero allowed or required attributes如何使用零允许或必需属性使无效属性测试通过
【发布时间】:2016-06-23 00:43:30
【问题描述】:

使用 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

似乎 cast 只是忽略了任何不在允许列表中的数据,因此变更集被认为是有效的,未通过测试。

【问题讨论】:

    标签: elixir ecto ex-unit


    【解决方案1】:

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

    【讨论】:

    • 在这种情况下,简单地摆脱测试是常见的吗?如果架构发生变化,也许可以将其恢复?
    • @AlejandroHuerta 是的。您的函数对任何属性都有效,因此目前测试无效属性没有意义。
    • @tkowal,有道理。谢谢
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多