gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:19:05 26 4
gpt4 key购买 nike

我正在使用自定义数据库适配器构建一个 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com