【问题标题】:Phoenix 1.3 default generators // naive_datetime problemsPhoenix 1.3 默认生成器 // naive_datetime 问题
【发布时间】:2017-11-29 00:01:37
【问题描述】:

运行mix phx.gen.json Object Item items published_at:native_datetime 输出以下文件/测试:

迁移:

defmodule App.Repo.Migrations.CreateItems do
  use Ecto.Migration

  def change do
    create table(:items) do
      add :published_at, :naive_datetime
      timestamps()
    end

  end
end

测试夹具:

  @update_attrs %{ published_at: ~N[2011-05-18 15:01:01.000000] }

更新断言:

assert json_response(conn, 200)["data"] == %{
        "published_at" => ~N[2011-05-18 15:01:01.000000] }

失败并出现以下情况:

code:  assert json_response(conn, 200)["data"] == %{"published_at" => ~N"2011-05-18 15:01:01.000000",}
left:  %{"published_at" => "2011-05-18T15:01:01.000000"}
right: %{"published_at" => ~N[2011-05-18 15:01:01.000000]}

~N[..] 值替换为普通的“字符串化”时间戳,测试通过了。为了让它与定义的列类型一起工作,应用的默认更改是什么?

【问题讨论】:

  • 您当前正在测试 json 响应,而不是实际数据类型。您可以直接执行查询...
  • 嗯,我明白了,一个 json kv 对总是一个字符串。但是显示的示例是使用默认生成器 (mix phx.gen.json Object Item items published_at:naive_datetime) 生成的;为了在默认情况下获得成功的行为,是否需要在配置中的某处指定一些内容?

标签: elixir phoenix-framework ecto


【解决方案1】:

两件事:

  1. asserthas it’s own handler为匹配运算符=,使用它;
  2. 您应该从您的字符串中构造NaiveDateTime 结构(反之亦然)。

assert %{"published_at" => ~N[2011-05-18 15:01:01.000000]} =
       conn
       |> json_response(200)["data"]
       |> NaiveDateTime.from_iso8601!()

assert %{"published_at" => "2011-05-18T15:01:01.000000"} =
       json_response(conn, 200)["data"]

【讨论】:

  • 你认为他们故意让这个错误出现在生成器中吗?
  • 我不确定我是否遵循。他们如何处理字符串与结构的比较?
  • 这些测试是从命令自动生成的;我可能错了,但根据字段类型,听起来可以生成成功的断言
  • 传入的 json 响应有一个字符串值。您将如何转换为字段类型?如果是"2017/11/30"呢?
  • 我在我的问题中写的都是自动生成的;命令是mix phx.gen.json Object Item items published_at:naive_datetime;它知道它是 json,并且它是一个日期时间。让我想知道为什么不处理它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多