凤凰/控制器中的测试日期

时间:2018-09-09 11:07:12

标签: elixir phoenix-framework phoenix

具有以下基本测试(使用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"

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

1 个答案:

答案 0 :(得分:3)

item.published_atNaiveDateTime结构。当将其转换为JSON时,编码器(此处可能为Poison)会将其转换为ISO8601字符串表示形式。

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

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

published_at