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
Elixir 功能范围问题_Elixir_Phoenix Framework - Fatal编程技术网

Elixir 功能范围问题

Elixir 功能范围问题,elixir,phoenix-framework,Elixir,Phoenix Framework,我有一个名为insert_user的方法,它在应用程序的其他部分工作正常,但由于某些原因,在本例中它没有定义,无法找出原因 ** (CompileError) test/models/user_repo_test.exs:8: undefined function insert_user/1 (stdlib) lists.erl:1338: :lists.foreach/2 (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6 (

我有一个名为insert_user的方法,它在应用程序的其他部分工作正常,但由于某些原因,在本例中它没有定义,无法找出原因

** (CompileError) test/models/user_repo_test.exs:8: undefined function insert_user/1
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (elixir) lib/code.ex:376: Code.require_file/2
    (elixir) lib/kernel/parallel_require.ex:59: anonymous fn/2 in Kernel.ParallelRequire.spawn_requires/5
代码如下:

defmodule Rumbl.UserRepoTest do
  use Rumbl.ModelCase
  alias Rumbl.User

  @valid_attrs %{name: "A User", username: "eva"}

  test "converts unique_constraint on username to error" do
    insert_user(username: "eric")
    attrs = Map.put(@valid_attrs, :username, "eric")
    changeset = User.changeset(%User{}, attrs)

    assert {:error, changeset} = Repo.insert(changeset)
    assert {:username, "has already been taken"} in changeset.errors
  end
end
这是t
est/support/test\u helpers.ex中的定义

defmodule Rumbl.TestHelpers do

  alias Rumbl.Repo

  def insert_user(attrs \\ %{}) do
    changes = Enum.into(attrs, %{
      name: "Some User",
      username: "user#{Base.encode16(:crypto.strong_rand_bytes(8))}",
      password: "supersecret",
    })

    %Rumbl.User{}
    |> Rumbl.User.registration_changeset(changes)
    |> Repo.insert!()
  end

  def insert_video(user, attrs \\ %{}) do
    user
    |> Ecto.build_assoc(:videos, attrs)
    |> Repo.insert!()
  end

如果未使用
宏块在
中的
Rumbl.ModelCase
中导入
Rumbl.TestHelpers
,则必须在测试套件中显式添加它才能导入此函数

它应该会有所帮助,但除此之外-请检查您的
TestHelpers
是否位于
test/support
目录中。在
mix.exs
中,您应该具有如下功能:

defp elixirc_paths(:test), do: ["lib", "web", "test/support"]

因此,如果不将文件放在适当的目录中,它将无法加载。

在测试文件中,您可以尝试在函数前面加上模块名,因此
insert\u user(username:“eric”)
将是
TestSupport。insert\u user(username:“eric”)
,或者您可以在测试中导入此函数:
import TestSupport,仅:[插入用户:1]
。这两种方法对您都有效吗?它抱怨没有加载TestSupport,我尝试使用Rumbl.TestHelper或import TestSupport加载它。仅…等,但不起作用。我不知道您的支持模块的完全限定名称是什么-在这种情况下,您是否可以尝试我的建议并用替换
TestSupport
Rumbl.TestHelper
?我用完整的模块定义更新了答案。您的mix.exs是否在elixirc_路径中列出了测试/支持。例如,我有:def project do[…elixirc_路径:[“lib”,“web”,“test/support”]…]结束;通常这是在per env basisgoddamnit上完成的,就是这样!我在看一本书,书中没有提到将Rumbl.TestHelper添加到ModelCase导入中,这让我很恼火。添加后效果很好