断言时间戳以微秒为单位等于Ecto / Phoenix中的mysql数据库值

时间:2017-01-09 19:41:01

标签: mysql elixir phoenix-framework ecto

我一直在玩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的一个问题,但不知道如何解决。

1 个答案:

答案 0 :(得分:0)

正如Ecto v2.1 CHANGELOG中所提到的,为了获得不将usec保留在自动时间戳中的旧行为(就像它直到Ecto< v2.1),您可以添加以下模块属性在相关模型中调用schema之前:

@timestamps_opts [usec: false]