"Cannot begin test transaction because we are already inside one"
"Cannot begin test transaction because we are already inside one"
我遵循了 this tutorial 并且我的简单测试总是失败并出现此错误
1) test /index returns a list of contacts (WorldNote.ChatsControllerTest)
test/controllers/chats_controller_test.exs:16
** (RuntimeError) cannot begin test transaction because we are already inside one
stacktrace:
(ecto) lib/ecto/adapters/sql.ex:321: anonymous fn/6 in Ecto.Adapters.SQL.start_test_transaction/3
(ecto) lib/ecto/adapters/sql.ex:615: Ecto.Adapters.SQL.pool_transaction/4
(ecto) lib/ecto/adapters/sql.ex:314: Ecto.Adapters.SQL.start_test_transaction/3
test/controllers/chats_controller_test.exs:9: WorldNote.ChatsControllerTest.__ex_unit_setup_0/1
test/controllers/chats_controller_test.exs:1: WorldNote.ChatsControllerTest.__ex_unit__/2
代码很简单
defmodule WorldNote.ChatsControllerTest do
use ExUnit.Case, async: false
use Plug.Test
alias WorldNote.Chats
alias WorldNote.Repo
alias Ecto.Adapters.SQL
setup do
SQL.begin_test_transaction(Repo)
on_exit fn ->
SQL.rollback_test_transaction(Repo)
end
end
test "/index returns a list of contacts" do
contacts_as_json =
%Chats{fbid: 1234567890, latitude: 0.0, longitude: 0.0, content: "yo"}
|> Repo.insert
|> List.wrap
|> Poison.encode!
response = conn(:get, "/api/contacts") |> send_request
assert response.status == 200
assert response.resp_body == contacts_as_json
end
defp send_request(conn) do
conn
|> put_private(:plug_skip_csrf_protection, true)
|> WorldNote.Endpoint.call([])
end
end
我用谷歌搜索了整个错误 cannot begin test transaction because we are already inside one
。但是找不到任何修复。
PS。我正在使用 Postgresql
您使用的是最新的 Phoenix 吗?如果是这样,它应该已经生成 test/support/conn_case.ex
,其中已经包含 运行 控制器测试所需的所有步骤。您只需要在测试中执行 use YourApp.ConnCase
即可。博客 post 是在测试基础设施到位之前写的。 :)
也就是说,原因很可能是因为 test/test_helper.exs
已经调用了 begin_test_transaction
。
我遵循了 this tutorial 并且我的简单测试总是失败并出现此错误
1) test /index returns a list of contacts (WorldNote.ChatsControllerTest)
test/controllers/chats_controller_test.exs:16
** (RuntimeError) cannot begin test transaction because we are already inside one
stacktrace:
(ecto) lib/ecto/adapters/sql.ex:321: anonymous fn/6 in Ecto.Adapters.SQL.start_test_transaction/3
(ecto) lib/ecto/adapters/sql.ex:615: Ecto.Adapters.SQL.pool_transaction/4
(ecto) lib/ecto/adapters/sql.ex:314: Ecto.Adapters.SQL.start_test_transaction/3
test/controllers/chats_controller_test.exs:9: WorldNote.ChatsControllerTest.__ex_unit_setup_0/1
test/controllers/chats_controller_test.exs:1: WorldNote.ChatsControllerTest.__ex_unit__/2
代码很简单
defmodule WorldNote.ChatsControllerTest do
use ExUnit.Case, async: false
use Plug.Test
alias WorldNote.Chats
alias WorldNote.Repo
alias Ecto.Adapters.SQL
setup do
SQL.begin_test_transaction(Repo)
on_exit fn ->
SQL.rollback_test_transaction(Repo)
end
end
test "/index returns a list of contacts" do
contacts_as_json =
%Chats{fbid: 1234567890, latitude: 0.0, longitude: 0.0, content: "yo"}
|> Repo.insert
|> List.wrap
|> Poison.encode!
response = conn(:get, "/api/contacts") |> send_request
assert response.status == 200
assert response.resp_body == contacts_as_json
end
defp send_request(conn) do
conn
|> put_private(:plug_skip_csrf_protection, true)
|> WorldNote.Endpoint.call([])
end
end
我用谷歌搜索了整个错误 cannot begin test transaction because we are already inside one
。但是找不到任何修复。
PS。我正在使用 Postgresql
您使用的是最新的 Phoenix 吗?如果是这样,它应该已经生成 test/support/conn_case.ex
,其中已经包含 运行 控制器测试所需的所有步骤。您只需要在测试中执行 use YourApp.ConnCase
即可。博客 post 是在测试基础设施到位之前写的。 :)
也就是说,原因很可能是因为 test/test_helper.exs
已经调用了 begin_test_transaction
。