【问题标题】:Testing Elixir/Ecto dates测试 Elixir/Ecto 日期
【发布时间】:2018-01-20 11:25:46
【问题描述】:

我在 Elixir 和 Phoenix 中的测试还有另一个问题。我有一个代表用户的模块,如下所示:

defmodule AppExample.Accounts.User do
  use Ecto.Schema
  import Ecto.Changeset
  alias SecuritytrailsApi.Accounts.User

  schema "users" do
    field :email, :string
    field :password, :string, virtual: true
    field :password_hash, :string
    field :last_login, :naive_datetime

    timestamps()
  end

  ...
  def registration_changeset(%User{} = user, attrs \\ %{}) do
    user
    |> changeset(attrs) # validating and castnig email
    |> validate_required([:password])
    |> put_password_hash # creates password hash from password
    |> set_default_date
  end

  defp set_default_date(chanegset) do
     case changeset do
       %Ecto.Changeset{valid?: true} ->
          put_change(changeset, :last_login, Ecto.DateTime.utc)
       _ -> changeset
     end
  end
end

假设我有一个帐户上下文,它负责创建新帐户。像这样:

defmodule AppExample.Accounts do
  def create_user(attrs \\ %{}) do
    %User{}
    |> User.registration_changeset(attrs)
    |> Repo.insert
  end
end

如您所见,last_login 字段会使用Ecto.DateTime.utc 自动插入以获取 now() 时间。所以,我的问题如下:

1) 这是向 Ecto 中的字段添加默认 now() 值的正确方法吗?

2) 我该如何为此编写测试?我不知道如何获得该特定字段的值。请查看以下示例以获取详细信息。

defmodule AccountsTest do
   @valid_attrs %{email: "mail@mail.com", password: "123123"}
   test "create_user/1 creates a new users with last_login set to now" do
     assert {:ok, %User{} = user} = Accounts.create_user(@valid_attrs)
     assert user.email == "mail@mail.com"
     assert user.last_login == ### ????? How can I get that NOW value here for the test
   end
end

【问题讨论】:

    标签: unit-testing elixir phoenix-framework ecto


    【解决方案1】:

    1) 这是向 Ecto 中的字段添加默认 now() 值的正确方法吗?

    您可以在迁移中将此字段默认为now(),而不是手动计算其值。

    alter table(:users) do
      modify :last_login, :string, default: fragment("now()")
    end
    

    2) 我该如何为此编写测试?

    您可以断言该值在最后一个,例如15 秒:

    assert DateTime.diff(DateTime.utc_now, user.last_login, :second) <= 15
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2016-02-13
      • 1970-01-01
      • 2016-10-26
      相关资源
      最近更新 更多