Ole*_*ann 4 elixir phoenix-framework
我正在使用自定义数据库适配器构建一个elixir phoenix应用程序来连接到OrientDB.因此我使用该--no-ecto选项生成了基本应用程序,因为我没有使用Ecto.
我正在构建自定义模型和自定义验证,但当然希望进行单元测试.
如果我尝试在我的单元测试中包含ModelCase,如下所示:
defmodule App.UserTest do
use App.ModelCase
end
Run Code Online (Sandbox Code Playgroud)
我收到了错误
module App.ModelCase is not loaded and could not be found
Run Code Online (Sandbox Code Playgroud)
这可能是因为它是Ecto的一部分.
如果我不包含它,代码会在以后失败,告诉我
undefined function test/2
Run Code Online (Sandbox Code Playgroud)
我该怎么处理?
简短的回答:而use App.ModelCase不仅仅是使用use ExUnit.Case.
答案很长.使用Ecto创建项目时,您将获得三个不同的测试用例模板test/support:
案例模板用于定义可在每个使用模板的测试中使用的函数.
例如,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
Run Code Online (Sandbox Code Playgroud)
内部的所有内容quote do ... end都是在测试用例开始时注入的.如果您不使用Ecto,这根本没用.第一行别名repo,下一行导入Ecto模块(你没有)
安装功能可确保在事务内部运行测试,这些测试在完成后可以回滚,errors_on并且也是特定于Ecto的.这就是为什么当你运行时这个模块根本不存在的原因--no-ecto.
所以你有两个选择.您可以使用ExUnit.Case哪种是处理测试的标准方法(您可以通过使用mix创建非Phoenix应用程序来检查)或者您可以创建自己的App.ModelCase.如果模型测试用例之间有足够的共享代码,这可能是个好主意.
| 归档时间: |
|
| 查看次数: |
2313 次 |
| 最近记录: |