Phoenix框架:如何在user_controller_test中用setup块预创建Account
解决Phoenix测试中User关联Account的外键约束问题
1. 在setup块中创建Account实例
打开test/controllers/user_controller_test.exs,在测试模块的setup块里创建一个合法的Account,将其传递给后续测试用例:
setup do # 调用Account上下文的创建函数,传入该模型所需的必填参数 {:ok, account} = Accounts.create_account(%{name: "测试账户"}) # 将创建好的Account注入测试上下文 {:ok, account: account} end
2. 为User创建参数补充account_id
有两种简洁的处理方式:
方式一:在测试用例中动态注入
先保留原有的@create_attrs,在测试时合并account_id:
@create_attrs %{name: "测试用户", email: "test@example.com"} test "创建合法User并返回数据", %{conn: conn, account: account} do # 给创建参数添加合法的account_id user_params = Map.put(@create_attrs, :account_id, account.id) conn = post(conn, Routes.user_path(conn, :create), user: user_params) assert %{"id" => id} = json_response(conn, 201)["data"] conn = get(conn, Routes.user_path(conn, :show, id)) assert json_response(conn, 200)["data"]["account_id"] == account.id end
方式二:在setup中预先处理好完整参数
如果多个测试都需要用到带account_id的参数,可以直接在setup里生成:
@base_create_attrs %{name: "测试用户", email: "test@example.com"} setup do {:ok, account} = Accounts.create_account(%{name: "测试账户"}) # 合并生成完整的User创建参数 full_create_attrs = Map.merge(@base_create_attrs, %{account_id: account.id}) {:ok, account: account, create_attrs: full_create_attrs} end test "创建合法User并返回数据", %{conn: conn, create_attrs: create_attrs} do conn = post(conn, Routes.user_path(conn, :create), user: create_attrs) # 后续断言逻辑不变 end
注意事项
- 确保
Accounts上下文模块存在create_account/1函数(phx.gen.json生成代码时默认会生成)。 - 如果Account模型有其他必填字段,要在setup的创建参数中补充完整,比如Account需要邮箱就改成
%{name: "测试账户", email: "account@test.com"}。 - Phoenix测试会自动在每个用例执行后回滚数据库,无需担心测试数据污染。
内容的提问来源于stack exchange,提问作者afsd7fg9asdf
相关产品推荐
相关产品推荐

