gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:01:27 25 4
gpt4 key购买 nike

我已经编写了以下测试。

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>

对比
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]

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

最佳答案

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

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,则后者更简洁。

关于elixir - 如何通过由于卸载关联而失败的测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44548691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com