我一直在玩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
在相关模型中的调用之前添加以下模块属性( s):
@timestamps_opts [usec: false]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句