凤凰/控制器中的测试日期
phoenix / testing dates in controllers
进行以下基本测试(使用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"
断言这种情况的正确方法是什么 — 如何正确 "cast" 日期?
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),
...
}
]
进行以下基本测试(使用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"
断言这种情况的正确方法是什么 — 如何正确 "cast" 日期?
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),
...
}
]