Финикс / даты тестирования в контроллерах - PullRequest
0 голосов
/ 09 сентября 2018

Наличие следующего базового теста (с использованием ex_machina):

# factory
def item_factory do
  %Api.Content.Item{
    title: "Some title",
    content: "Some content",
    published_at: NaiveDateTime.utc_now
  }
end

# test
test "lists all items", %{conn: conn} do
  item = insert(:item)
  conn = get conn, item_path(conn, :index)
  assert json_response(conn, 200)["data"] == [
    %{
      "content" => item.content,
      "published_at" => item.published_at,
      "title" => item.title,
      "id" => item.id
    }
  ]
end

Получаю ошибку в дату:

left: ... "published_at" => "2010-04-17T14:00:00.000000"
right: ... "published_at" => ~N[2010-04-17 14:00:00.000000]

Попробовал простое утверждение строки с помощью "published_at" => "#{item.published_at}"

Но все равно не удается:

left: ..."published_at" => "2010-04-17T14:00:00.000000"
right: ..."published_at" => "2010-04-17 14:00:00.000000"

Как правильно утверждать такой случай - как правильно «разыграть» дату?

1 Ответ

0 голосов
/ 09 сентября 2018

item.published_at является структурой NaiveDateTime. Когда он конвертируется в JSON, кодировщик (вероятно, Poison здесь) преобразует его в строковое представление ISO8601.

Ваша первая попытка не удалась, потому что вы сравниваете структуру NaiveDateTime с String. Второй сбой, потому что String.Chars реализация NaiveDateTime использует представление, отличное от ISO8601.

Самый простой способ исправить это - вручную преобразовать published_at в его представление ISO 8601:

assert json_response(conn, 200)["data"] == [
  %{
    ...
    "published_at" => NaiveDateTime.to_iso8601(item.published_at),
    ...
  }
]
...