我正在使用自定义数据库适配器构建一个 elixir phoenix 应用程序以连接到 OrientDB。所以我用 --no-ecto
生成了基础应用程序。选项,因为我没有使用 Ecto。
我正在构建自定义模型和自定义验证,但当然想做单元测试。
如果我尝试在我的单元测试中包含 ModelCase,如下所示:
defmodule App.UserTest do
use App.ModelCase
end
我得到错误
module App.ModelCase is not loaded and could not be found
这可能是因为它是 Ecto 的一部分。
如果我不包含它,代码稍后会失败,告诉我
undefined function test/2
我该如何处理?
最佳答案
简短回答:而不是 use App.ModelCase
只需使用 use ExUnit.Case
.
长答案。使用 Ecto 创建项目时,您会在 test/support
中获得三个不同的测试用例模板。 :
Case templates用于定义可以在使用模板的每个测试中使用的函数。
例如
model_case
为您定义:using do
quote do
alias App.Repo
import Ecto
import Ecto.Changeset
import Ecto.Query, only: [from: 1, from: 2]
import App.ModelCase
end
end
setup tags do
unless tags[:async] do
Ecto.Adapters.SQL.restart_test_transaction(App.Repo, [])
end
:ok
end
def errors_on(model, data) do
model.__struct__.changeset(model, data).errors
end
里面的一切
quote do ... end
在测试用例开始时注入(inject)。如果您不使用 Ecto,这根本没有用。第一行别名 repo,下一行导入 Ecto 模块(你没有)设置功能确保测试在事务中运行,完成后可以回滚,
errors_on
也是 Ecto 特定的。这就是为什么当你使用 --no-ecto
运行时这个模块根本不存在的原因。 .所以你有两个选择。您可以使用
ExUnit.Case
这是处理测试的标准方式(您可以通过使用 mix 创建非 Phoenix 应用程序来检查)或者您可以创建自己的 App.ModelCase
.如果模型测试用例之间有足够的共享代码,这可能是一个好主意。
关于 Elixir /Phoenix : How to do unit tests for models without using Ecto?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36657231/