Elixir 功能范围问题
我有一个名为insert_user的方法,它在应用程序的其他部分工作正常,但由于某些原因,在本例中它没有定义,无法找出原因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 (
** (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
这是test/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导入中,这让我很恼火。添加后效果很好