dev*_*ium 1 unit-testing elixir ecto phoenix-framework
我在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
Run Code Online (Sandbox Code Playgroud)
让我们说我有一个帐户上下文,负责创建新帐户.像这样:
defmodule AppExample.Accounts do
def create_user(attrs \\ %{}) do
%User{}
|> User.registration_changeset(attrs)
|> Repo.insert
end
end
Run Code Online (Sandbox Code Playgroud)
因此,您可以last_login使用此字段自动插入Ecto.DateTime.utc以获取now()时间.所以,我的问题如下:
1)这是向now()Ecto中的字段添加默认值的正确方法吗?
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
Run Code Online (Sandbox Code Playgroud)
1)这是将默认now()值添加到Ecto中的字段的正确方法吗?
您可以将此字段默认now()为迁移,而不是手动计算其值.
alter table(:users) do
modify :last_login, :string, default: fragment("now()")
end
Run Code Online (Sandbox Code Playgroud)
2)我怎样才能为此编写测试?
您可以断言该值在最后一次,例如15秒:
assert DateTime.diff(DateTime.utc_now, user.last_login, :second) <= 15
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
419 次 |
| 最近记录: |