Elixir /Phoenix : How to do unit tests for models without using Ecto?

标签 elixir phoenix-framework

我正在使用自定义数据库适配器构建一个 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 中获得三个不同的测试用例模板。 :

  • channel_case.ex
  • conn_case.ex
  • model_case.ex

  • 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/

    相关文章:

    elixir - 是尾递归吗

    elixir - 将指数表示法的 Elixir 数字转换为整数

    elixir - 在 Phoenix 模板中显示 JSON 数据

    web-deployment - Elixir Phoenix 生产服务器出现 Letsencrypt 更新问题

    elixir - 自定义混合任务未加载测试环境

    recursion - Elixir尾调用递归函数

    elixir - 使用 Elixir/Phoenix,由于对 phoenix.gen.resource 生成的 CRUD 进行严格验证,无法从 Web UI 创建包含空字段的记录

    elixir - 在混合任务中使用 Bamboo 发送电子邮件

    macros - Phoenix 伞编译命令

    phoenix-framework - 如何动态地将嵌套表单字段添加到当前表单中?