【问题标题】:phoenix / testing dates in controllers凤凰 / 控制器中的测试日期
【发布时间】:2019-02-14 01:35:35
【问题描述】:

进行以下基本测试(使用 ex_machina):

# factory
def item_factory do
  %Api.Content.Item{
    title: "Some title",
    content: "Some content",
    published_at: NaiveDateTime.utc_now
  }
end

# test
test "lists all items", %{conn: conn} do
  item = insert(:item)
  conn = get conn, item_path(conn, :index)
  assert json_response(conn, 200)["data"] == [
    %{
      "content" => item.content,
      "published_at" => item.published_at,
      "title" => item.title,
      "id" => item.id
    }
  ]
end

日期出现错误:

left: ... "published_at" => "2010-04-17T14:00:00.000000"
right: ... "published_at" => ~N[2010-04-17 14:00:00.000000]

用"published_at" => "#{item.published_at}"尝试了一个简单的字符串断言

但仍然失败:

left: ..."published_at" => "2010-04-17T14:00:00.000000"
right: ..."published_at" => "2010-04-17 14:00:00.000000"

断言这种情况的正确方法是什么——如何正确“投射”日期?

【问题讨论】:

  • 你试过NaiveDateTime.to_string(item.published_at)吗?
  • @m3characters 刚刚在断言响应负载检查中做了NaiveDateTime.to_string(item.published_at),左边是"2018-09-09T11:23:21.896696",右边仍然是"2018-09-09 11:23:21.896696"
  • 试试NaiveDateTime.to_iso8601(item.published_at)。
  • 我们去!非常感谢。您介意详细说明答案中发生的事情吗?我真的不明白这一切的基础。无论如何;再次感谢

标签: elixir phoenix-framework phoenix


【解决方案1】:

item.published_at 是一个 NaiveDateTime 结构。当它被转换为 JSON 时,编码器(这里可能是Poison)将它转换为它的 ISO8601 字符串表示形式。

您的第一次尝试失败,因为您将NaiveDateTime 结构与String 进行比较。第二个失败是因为NaiveDateTime 的String.Chars 实现使用与ISO8601 不同的表示。

解决此问题的最简单方法是将published_at 手动转换为其 ISO 8601 表示:

assert json_response(conn, 200)["data"] == [
  %{
    ...
    "published_at" => NaiveDateTime.to_iso8601(item.published_at),
    ...
  }
]

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多