如何通过测试,由于卸载关联而失败?

时间:2017-06-14 15:17:53

标签: elixir phoenix-framework ecto

我写了以下测试。

test "list_users/1 returns all users in a tenant", %{tenant: tenant} do
  user = insert(:user, tenant: tenant)
  user_2 = insert(:user, tenant: tenant)

  assert Accounts.list_users(tenant) == [user_2, user]
end

我正在测试如果我让所有用户回到租户中,为此,我需要为我的工厂分配我想要测试的租户。 问题是,当我为用户分配租户时,现在加载了关联。返回的用户没有,因此测试失败并带有以下差异..

tenant: #Ecto.Association.NotLoaded<association :tenant is not loaded>

VS

tenant: %MyApp.Accounts.Tenant{__meta__: #Ecto.Schema.Metadata<:loaded, "tenants">, domain: "pharma-13", id: 484, inserted_at: ~N[2017-06-14 15:10:42.125243], logo: "some_logo_path.png", name: "Pharma", updated_at: ~N[2017-06-14 15:10:42.125250]

我应该以某种方式卸载关联吗?我当然不想为我的功能添加预加载,只是为了通过测试。

1 个答案:

答案 0 :(得分:0)

这实际上取决于您要测试的内容。如果您不关心关联,我的建议是单独对每个属性进行断言或运行模式匹配断言。这将类似于:

user_1 = insert(:user, tenant: tenant)
user_2 = insert(:user, tenant: tenant)

assert [found_user_2, found_user_1] = Accounts.list_users(tenant)
assert user_1.id == found_user_1.id
assert user_2.id == found_user_2.id

%{id: user_1_id} = insert(:user, tenant: tenant)
%{id: user_2_id} = insert(:user, tenant: tenant)

assert [%{id: ^user_2_id}, %{id: ^user_1_id}] = Accounts.list_users(tenant)

第三种选择可能是在测试中预加载关联。

归根结底,这里没有正确或错误的答案。这真的取决于你想测试什么。第一个选项提供了一种更简洁的方式来断言多个属性,如果您只想检查 id,后者更简洁。