断言微秒时间戳等于 mysql Ecto/Phoenix 中的数据库值
Asserting timestamp with microseconds equals mysql database value in Ecto/Phoenix
我一直在玩弄 Elixir Phoenix 并进行了一个简单的集成测试,该测试检查模型的 json 响应是否与该模型的 json 渲染表示相同。
测试看起来像这样:
test "#show renders a single link" do
conn = get_authenticated_conn()
link = insert(:link)
conn = get conn, link_path(conn, :show, link)
assert json_response(conn, 200) == render_json(LinkView, "show.json", link: link)
end
这曾经工作得很好,但在最近的一次 mix deps.update
之后,由于模型时间戳的精度问题,测试失败了。这是测试的输出:
Assertion with == failed
code: json_response(conn, 200) == render_json(LinkView, "show.json", link: link)
lhs: %{"id" => 10, "title" => "A handy site to find stuff on the internet", "url" => "http://google.com", "inserted_at" => "2017-01-09T19:27:57.000000", "updated_at" => "2017-01-09T19:27:57.000000"}
rhs: %{"id" => 10, "title" => "A handy site to find stuff on the internet", "url" => "http://google.com", "inserted_at" => "2017-01-09T19:27:56.606085", "updated_at" => "2017-01-09T19:27:56.606093"}
我们可以看到控制器给出的响应的时间戳与模型的json渲染不匹配。这是因为 MySQL 数据库 (5.7) 将微秒舍入为 0,而内存中的 Ecto 模型表示支持更高的精度。我的迁移只使用 Ecto 的 timestamps
函数。
通过这些测试的最佳方法是什么?我并不特别关心我的时间戳的微秒精度,但显然 Ecto 在最近的更新中使它更加准确。我感觉这可能是 MariaEx 的问题,但不确定如何解决。
如 Ecto v2.1 CHANGELOG 中所述,要获得不在自动时间戳中保留 usec
的旧行为(就像 Ecto < v2.1 之前一样),您可以添加以下模块属性在相关模型中调用 schema
之前:
@timestamps_opts [usec: false]
我一直在玩弄 Elixir Phoenix 并进行了一个简单的集成测试,该测试检查模型的 json 响应是否与该模型的 json 渲染表示相同。
测试看起来像这样:
test "#show renders a single link" do
conn = get_authenticated_conn()
link = insert(:link)
conn = get conn, link_path(conn, :show, link)
assert json_response(conn, 200) == render_json(LinkView, "show.json", link: link)
end
这曾经工作得很好,但在最近的一次 mix deps.update
之后,由于模型时间戳的精度问题,测试失败了。这是测试的输出:
Assertion with == failed
code: json_response(conn, 200) == render_json(LinkView, "show.json", link: link)
lhs: %{"id" => 10, "title" => "A handy site to find stuff on the internet", "url" => "http://google.com", "inserted_at" => "2017-01-09T19:27:57.000000", "updated_at" => "2017-01-09T19:27:57.000000"}
rhs: %{"id" => 10, "title" => "A handy site to find stuff on the internet", "url" => "http://google.com", "inserted_at" => "2017-01-09T19:27:56.606085", "updated_at" => "2017-01-09T19:27:56.606093"}
我们可以看到控制器给出的响应的时间戳与模型的json渲染不匹配。这是因为 MySQL 数据库 (5.7) 将微秒舍入为 0,而内存中的 Ecto 模型表示支持更高的精度。我的迁移只使用 Ecto 的 timestamps
函数。
通过这些测试的最佳方法是什么?我并不特别关心我的时间戳的微秒精度,但显然 Ecto 在最近的更新中使它更加准确。我感觉这可能是 MariaEx 的问题,但不确定如何解决。
如 Ecto v2.1 CHANGELOG 中所述,要获得不在自动时间戳中保留 usec
的旧行为(就像 Ecto < v2.1 之前一样),您可以添加以下模块属性在相关模型中调用 schema
之前:
@timestamps_opts [usec: false]