# Testing Virtual Field 

**URL:** <https://forum.elixirforum.com/t/testing-virtual-field/18135>\
**Category:** Questions\
**Tags:** phoenix, testing, virtual-fields\
**Created:** [November 22, 2018, 4:42pm UTC](https://forum.elixirforum.com/t/testing-virtual-field/18135 "2018-11-22T16:42:28Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Iggy](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/iggy/32/12789_2.png) [@Iggy](https://forum.elixirforum.com/u/Iggy)\
**Post date:** [November 22, 2018, 4:42pm UTC](https://forum.elixirforum.com/t/testing-virtual-field/18135/1 "2018-11-22T16:42:28Z")

</div>

Hey all,

What is the best practice when testing user’s password? My user schema has a `:password_digest` field and `:password` virtual field. I am having problem making the test pass because password field is empty.

On sign up, user enters their password. In user changeset, the password is hashed (with bcrypt), and then that hash is saved under password\_digest.

```
  schema "users" do
    field :email, :string
    field :password_digest, :string
    field :username, :string

    timestamps()

    field :password, :string, virtual: true
  end

```

In the test, I have (from generator, modified a bit):

```
@valid_attrs %{email: "some email", password: "some password", username: "some username"}

   ...

def user_fixture(attrs \\ %{}) do
  {:ok, user} =
    attrs
    |> Enum.into(@valid_attrs)
    |> Accounts.create_user()

  user
end

  ...

test "get_user!/1 returns the user with given id" do
  user = user_fixture()
  assert Accounts.get_user!(user.id) == user
end

```

The test above fails because password on left is nil, while on the right side it still has the password. I am not saving password in database.

```
  1) test users get_user!/1 returns the user with given id...
     ...
     Assertion with == failed
     code: assert Accounts.get_user!(user.id()) == user
     left: ... email: "some email", id: 56, inserted_at: ~N[2018-11-22 16:30:48], password_digest: "$2b$04$qjv2Log0RIcFoMdrLEbGGeMzBr3JQ9epDNgjSkxSB3cQO5ZBuzKPS", updated_at: ~N[2018-11-22 16:30:48], username: "some username", password: nil}
     right: ... email: "some email", id: 56, inserted_at: ~N[2018-11-22 16:30:48], password_digest: "$2b$04$qjv2Log0RIcFoMdrLEbGGeMzBr3JQ9epDNgjSkxSB3cQO5ZBuzKPS", updated_at: ~N[2018-11-22 16:30:48], username: "some username", password: "some password_digest"}

```

`user_fixture` saves the password, but `Accounts.get_user` does not. Btw, get user is taken from generator: `def get_user!(id), do: Repo.get!(User, id)`.

Thanks!

---

<div class="post-metadata">

**Author:** ![idi527](https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/i/85e7bf/32.png) [@idi527](https://forum.elixirforum.com/u/idi527)\
**Post date:** [November 22, 2018, 4:46pm UTC](https://forum.elixirforum.com/t/testing-virtual-field/18135/2 "2018-11-22T16:46:57Z")

</div>

You can try testing the changeset function. Or write a helper that would populate user’s `password` manually before `assert`.

---

<div class="post-metadata">

**Author:** ![LostKobrakai](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/lostkobrakai/32/3072_2.png) [@LostKobrakai](https://forum.elixirforum.com/u/LostKobrakai)\
**Post date:** [November 22, 2018, 5:02pm UTC](https://forum.elixirforum.com/t/testing-virtual-field/18135/3 "2018-11-22T17:02:59Z")

</div>

Imho the problem lies in the fact that you’re trying to compare `==/2` the source data to the data coming out of the db:

> [@Testing my Ecto Repo](https://forum.elixirforum.com/t/testing-my-ecto-repo/14820/12):
>
> On that note: Comparing ecto schema structs for equality (==/2) is hardly ever somethings you actually want to test for. E.g. the data coming out of the db will have an id, the input might not. The data coming out of the db have inserted-/updated\_at timestamps set, the input might not. There might be defaults for db columns that your runtime doesn’t know of. So total equality is not really to be expected. Tests are rather concerned with: “are those the same entities” a.k.a. do they hold the …

---

<div class="post-metadata">

**Author:** ![Iggy](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/iggy/32/12789_2.png) [@Iggy](https://forum.elixirforum.com/u/Iggy)\
**Post date:** [November 22, 2018, 5:35pm UTC](https://forum.elixirforum.com/t/testing-virtual-field/18135/4 "2018-11-22T17:35:11Z")

</div>

Thanks for the input all!  
I modified it to

```
test "get_user!/1 returns the user with given id" do
  assert {:ok, user} = Accounts.create_user(@valid_attrs)
  assert user.email == "some email"
  assert user.username == "some username"
  assert user.password == "some password"
end

```

You are right, I am comparing source data w/ data coming out of (testing) db. I can’t expect them to equal the same.
