Testing 长生不老药试验失败,出现“1”;原因:已经开始;
我目前正在进行我的第一个大型长生不老药项目,这次我想好好利用测试。 但是,如果我将我的模块添加到“正常”管理器中,我将无法使用Testing 长生不老药试验失败,出现“1”;原因:已经开始;,testing,elixir,Testing,Elixir,我目前正在进行我的第一个大型长生不老药项目,这次我想好好利用测试。 但是,如果我将我的模块添加到“正常”管理器中,我将无法使用start\u supervised再次启动它们和所有测试失败,原因:已启动:#PID 这是我的密码: (application.ex) 我的一些测试: defmodule PoolHandlerTest do use ExUnit.Case, async: true alias Websocks.PoolHandler doctest PoolHandler
start\u supervised再次启动它们代码>和所有测试失败,原因:已启动:#PID
这是我的密码:
(application.ex)
我的一些测试:
defmodule PoolHandlerTest do
use ExUnit.Case, async: true
alias Websocks.PoolHandler
doctest PoolHandler
setup do
start_supervised!({PoolHandler, %{}})
%{}
end
test "adding two pools and checking if they are there" do
assert PoolHandler.add(:first) == :ok
assert PoolHandler.add(:second) == :ok
assert PoolHandler.get_pools() == {:ok,%{:first => nil, :second => nil}}
end
和池处理程序:
defmodule Websocks.PoolHandler do
use GenServer
# Client
def start_link(default) when is_map(default) do
GenServer.start_link(__MODULE__, default, name: __MODULE__)
end
# Server (callbacks)
@impl true
def init(arg) do
{:ok, arg}
end
end
(我删掉了我认为不必要的东西,但完整的代码在github上:)
提前感谢您对我的任何帮助 正如@Everett在评论中提到的那样-当您进行
混合测试时,您的应用程序已经为您启动,因此无需再次启动genserver
。看起来您在测试中正在与全局实例交互,所以如果这是您想要的,那么它应该可以正常工作
但是,如果您只想为测试启动一个单独的实例,则需要启动一个未命名的实例。例如,您可以向包装函数添加可选的pid参数:
defmodule Websocks.PoolHandler do
# ...
def add(服务器\\\\模块\值)do
调用(服务器,{:add,value})
结束
# ...
结束
然后,不要使用start\u
与您一样,您可以在设置中启动一个未命名实例,并在测试中使用它,如下所示:
setup do
{:好的,pid}=GenServer.start_链接(PoolHandler,%{})
{:好,%{handler:pid}
结束
测试“添加两个池并检查它们是否存在”,%%{handler:handler}do
add(处理程序,:first)
# ...
结束
正如@Everett在评论中提到的那样-当您进行混合测试时,您的应用程序已经为您启动,因此无需再次启动GenServer
。看起来您在测试中正在与全局实例交互,所以如果这是您想要的,那么它应该可以正常工作
但是,如果您只想为测试启动一个单独的实例,则需要启动一个未命名的实例。例如,您可以向包装函数添加可选的pid参数:
defmodule Websocks.PoolHandler do
# ...
def add(服务器\\\\模块\值)do
调用(服务器,{:add,value})
结束
# ...
结束
然后,不要使用start\u
与您一样,您可以在设置中启动一个未命名实例,并在测试中使用它,如下所示:
setup do
{:好的,pid}=GenServer.start_链接(PoolHandler,%{})
{:好,%{handler:pid}
结束
测试“添加两个池并检查它们是否存在”,%%{handler:handler}do
add(处理程序,:first)
# ...
结束
我认为您不需要启动应用程序.ex中列出的测试--据我所知,应用程序.ex中的所有内容都是在您进行测试运行时启动的。我认为您不需要启动应用程序.ex中列出的测试--据我所知,application.ex
中的所有内容都是在您进行测试运行时启动的。“您需要启动一个未命名的应用程序”-从技术上讲,可能是命名的,只是名称必须与任何已注册的应用程序不同。“您需要启动一个未命名的应用程序”-从技术上讲,可能是命名的,只是名称必须与任何已注册的应用程序不同。
defmodule Websocks.PoolHandler do
use GenServer
# Client
def start_link(default) when is_map(default) do
GenServer.start_link(__MODULE__, default, name: __MODULE__)
end
# Server (callbacks)
@impl true
def init(arg) do
{:ok, arg}
end
end