为 ExUnit 和 iex 提供 fixtures 和 testhelp 函数
Make fixtures and testhelp functions available for ExUnit and iex
我正在编写一个我想测试的项目,既可以使用 ExUnit 自动测试,也可以使用 iex 交互测试。假设我的项目是这样的:
[mto@bgobuildwin8g sample]$ tree
.
├── config
│ └── config.exs
├── fixtures
│ └── complex_struct.exs
├── lib
│ └── the_function.ex
├── mix.exs
├── README.md
└── test
└── the_test.exs
4 directories, 7 files
[mto@bgobuildwin8g sample]$ cat lib/the_function.ex
defmodule TheFunction do
def the_function ({a, b, c}) do
a / b + c
end
end
[mto@bgobuildwin8g sample]$ cat fixtures/complex_struct.exs
defmodule ComplexStruct do
def complex_struct do
{2, 1, 1}
end
end
[mto@bgobuildwin8g sample]$ cat test/the_test.exs
defmodule IexandtestTest do
Code.load_file("fixtures/complex_struct.exs")
use ExUnit.Case
doctest Iexandtest
test "the test" do
assert (TheFunction.the_function (ComplexStruct.complex_struct())) == 3
end
end
我现在可以 运行 混合测试,它会找到 fixtures/complex_struct.exs 以便测试成功执行。我还喜欢使用以下命令调试我的代码
iex -S mix
这样我就可以访问 lib/the_function.ex 并可以对其进行调试。
iex(1)> TheFunction.the_function({1,2,3})
3.5
但是我无法访问 fixtures/complex_struct.exs,除非我这样加载它:
iex(1)> TheFunction.the_function(ComplexStruct.complex_struct())
** (UndefinedFunctionError) undefined function ComplexStruct.complex_struct/0 (module ComplexStruct is not available)
ComplexStruct.complex_struct()
iex(1)> Code.load_file("fixtures/complex_struct.exs")
[{ComplexStruct,
<<70, 79, 82, 49, 0, 0, 5, 28, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 137, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, 100, 0, ...>>}]
iex(2)> TheFunction.the_function(ComplexStruct.complex_struct())
3.0
什么决定了 iex 加载的内容以及如何在我 运行 iex -S mix 时使 lib 中的所有模块和所有固定装置可用?
只有 mix.exs
的 project/0
函数的 return 值的 :elixirc_paths
键指定的目录中的文件才会编译到您的应用程序中。 :elixirc_paths
的默认值为 ["lib"]
.
要在 fixtures
中编译 Elixir 文件,您需要将扩展名从 exs
更改为 ex
,然后将 fixtures
添加到 :elixirc_paths
:
def project do
[app: :m,
version: "0.1.0",
...,
elixirc_paths: ["lib", "fixtures"]]
end
在此之后,您将能够从 iex
和测试中访问 ComplexStruct
,并且您将不再需要在测试模块中调用 Code.load_file
。
我正在编写一个我想测试的项目,既可以使用 ExUnit 自动测试,也可以使用 iex 交互测试。假设我的项目是这样的:
[mto@bgobuildwin8g sample]$ tree
.
├── config
│ └── config.exs
├── fixtures
│ └── complex_struct.exs
├── lib
│ └── the_function.ex
├── mix.exs
├── README.md
└── test
└── the_test.exs
4 directories, 7 files
[mto@bgobuildwin8g sample]$ cat lib/the_function.ex
defmodule TheFunction do
def the_function ({a, b, c}) do
a / b + c
end
end
[mto@bgobuildwin8g sample]$ cat fixtures/complex_struct.exs
defmodule ComplexStruct do
def complex_struct do
{2, 1, 1}
end
end
[mto@bgobuildwin8g sample]$ cat test/the_test.exs
defmodule IexandtestTest do
Code.load_file("fixtures/complex_struct.exs")
use ExUnit.Case
doctest Iexandtest
test "the test" do
assert (TheFunction.the_function (ComplexStruct.complex_struct())) == 3
end
end
我现在可以 运行 混合测试,它会找到 fixtures/complex_struct.exs 以便测试成功执行。我还喜欢使用以下命令调试我的代码
iex -S mix
这样我就可以访问 lib/the_function.ex 并可以对其进行调试。
iex(1)> TheFunction.the_function({1,2,3})
3.5
但是我无法访问 fixtures/complex_struct.exs,除非我这样加载它:
iex(1)> TheFunction.the_function(ComplexStruct.complex_struct())
** (UndefinedFunctionError) undefined function ComplexStruct.complex_struct/0 (module ComplexStruct is not available)
ComplexStruct.complex_struct()
iex(1)> Code.load_file("fixtures/complex_struct.exs")
[{ComplexStruct,
<<70, 79, 82, 49, 0, 0, 5, 28, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 137, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, 100, 0, ...>>}]
iex(2)> TheFunction.the_function(ComplexStruct.complex_struct())
3.0
什么决定了 iex 加载的内容以及如何在我 运行 iex -S mix 时使 lib 中的所有模块和所有固定装置可用?
只有 mix.exs
的 project/0
函数的 return 值的 :elixirc_paths
键指定的目录中的文件才会编译到您的应用程序中。 :elixirc_paths
的默认值为 ["lib"]
.
要在 fixtures
中编译 Elixir 文件,您需要将扩展名从 exs
更改为 ex
,然后将 fixtures
添加到 :elixirc_paths
:
def project do
[app: :m,
version: "0.1.0",
...,
elixirc_paths: ["lib", "fixtures"]]
end
在此之后,您将能够从 iex
和测试中访问 ComplexStruct
,并且您将不再需要在测试模块中调用 Code.load_file
。