[英]Testing Elixir/Ecto dates
我在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
假設我有一個Accounts上下文 ,它負責創建新帳戶。 像這樣:
defmodule AppExample.Accounts do
def create_user(attrs \\ %{}) do
%User{}
|> User.registration_changeset(attrs)
|> Repo.insert
end
end
所以你可以ESE,現場last_login
使用自動插入Ecto.DateTime.utc
得到現在()的時間。 因此,我的問題如下:
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
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.