【问题标题】:Asserting timestamp with microseconds equals mysql database value in Ecto/Phoenix用微秒断言时间戳等于 Ecto/Phoenix 中的 mysql 数据库值
【发布时间】:2017-01-09 19:41:01
【问题描述】:

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

【问题讨论】:

  • 尝试在相关模型中的schema "..." do 调用上方添加@timestamps_opts [usec: false]。这应该使 Ecto 表现得像以前一样,而不是使用微秒精度。
  • 这样就行了!非常感谢,作为答案发布,我会接受

标签: mysql elixir phoenix-framework ecto


【解决方案1】:

Ecto v2.1 CHANGELOG 中所述,要获得不将usec 保留在自动时间戳中的旧行为(就像在 Ecto

@timestamps_opts [usec: false]

【讨论】:

  • 有没有办法只在测试配置中解决这个问题?
  • @jay 你可以试试这个,看看它是否有效:@timestamps_opts [usec: Mix.env != :test]?
  • 是的,行得通!我想知道是否有某种方法可以在 test_helper 中实现相同的目标。我是 elixir 和 Phoenix 的新手,所以我还不确定
  • 我不认为这可以应用于 test_helper 中的所有模型,但是您可以编写自己的断言函数,在比较之前删除usec 并在测试中使用它。
  • 这有点小技巧 - 本质上这些日期时间对象是地图..所以这很可能现在从秒开始.. 所以 ...12:33:33 是 > 11:22: 34 ..这显然是错误的。比较像这样的复杂类型是行不通的——老实说,我想我只是在这里用 Ecto/Elixir 遇到了一个巨大的痛点。当你试图弄清楚为什么 where 子句中的“简单”日期时间比较是这么困难。哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
相关资源
最近更新 更多