Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 长生不老药试验失败,出现“1”;原因:已经开始;_Testing_Elixir - Fatal编程技术网

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