用微秒断言时间戳等于Ecto/Phoenix中的mysql数据库值

用微秒断言时间戳等于Ecto/Phoenix中的mysql数据库值,mysql,elixir,phoenix-framework,ecto,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,

我一直在玩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模型表示支持更高的精度。我的迁移只使用了EXTO的
时间戳
功能

让这些测试通过的最好方法是什么?我并不特别关心我的时间戳的微秒精度,但很明显,在最近的一次更新中,Ecto使其更加精确。我觉得这可能是MariaEx的问题,但不确定如何解决。

如中所述,要获得不在自动时间戳中保留
usec
的旧行为(就像在Ectoschema之前添加以下模块属性:

如中所述,要获得在自动时间戳中不保留
usec
的旧行为(就像在Ectoschema之前添加以下模块属性:


尝试将
@timestamps\u选择[usec:false]
添加到
模式“…”的正上方,在相关模型中进行调用。这应该使星外行星的行为和以前一样,而不是使用微秒的精度。这就是诀窍!非常感谢,作为答案发布,我将接受尝试在
模式上方添加
@timestamps\u opts[usec:false]
“…”进行相关模型的调用。这应该使星外行星的行为和以前一样,而不是使用微秒的精度。这就是诀窍!非常感谢,发布为答案,我将接受只有在测试配置中才能解决这个问题吗?@jay你能试试看它是否有效:
@timestamps\u选项[usec:Mix.env!=:test]
?是的,有效!我想知道是否有办法达到同样的效果,但在测试中。。我是elixir和Phoenix的新手,所以我不确定yetI是否认为这可以应用于test_helper中的所有模型,但您可以编写自己的断言函数,在比较之前删除
usec
,并在测试中使用。这有点像黑客——本质上这些datetime对象是映射。。所以这很可能从现在的秒开始。。所以…12:33:33大于11:22:34。。这显然是错误的。比较像这样复杂的类型是行不通的-老实说,我想我只是在这里遇到了一个巨大的痛点,与异位/长生不老药。。当您试图弄明白为什么where子句中的“简单”日期时间比较如此困难时,这是相当粗糙的。哈,只有在测试配置中才能解决这个问题吗?@jay你能试试看它是否有效吗:
@timestamps\u选择[usec:Mix.env!=:test]
?是的,有效!我想知道是否有办法达到同样的效果,但在测试中。。我是elixir和Phoenix的新手,所以我不确定yetI是否认为这可以应用于test_helper中的所有模型,但您可以编写自己的断言函数,在比较之前删除
usec
,并在测试中使用。这有点像黑客——本质上这些datetime对象是映射。。所以这很可能从现在的秒开始。。所以…12:33:33大于11:22:34。。这显然是错误的。比较像这样复杂的类型是行不通的-老实说,我想我只是在这里遇到了一个巨大的痛点,与异位/长生不老药。。当您试图弄明白为什么where子句中的“简单”日期时间比较如此困难时,这是相当粗糙的。哈哈
@timestamps_opts [usec: false]