【问题标题】:Testing Queries in ExUnit for a library在 ExUnit 中为库测试查询
【发布时间】:2018-06-08 21:44:23
【问题描述】:

我正在 ExUnit 中为此库测试查询 (not the data returned from queries)。

https://github.com/tanweerdev/fat_ecto

这是我的代码:

 test "returns the query where field like" do
   opts = %{
    "$where" => %{"first_name" => %{"$like" => "%Ham %"}}
   }

   assert build(QM.Test.Model, opts) ==
 end

函数在控制台返回的结果是这样的:

 left:  #Ecto.Query<from m in QM.Test.Model,
         where: like(m.first_name, ^"%Ham %")>

这里的主要目标是查看build 函数是否正确构建查询。

我不是在测试 ecto。我正在测试构建查询的函数

如何将这个结果插入到右边的to make the tests pass。

任何建议。

谢谢。

【问题讨论】:

  • 您确定这是测试此逻辑的最佳方法吗?它有点测试Ecto.Query 的内部结构,并将它与它的工作方式紧密结合,这使得当你更新Ecto 时它变得非常脆弱。
  • 它看起来不是一个好方法...您正在测试 ecto 内部结构(已经过测试) - 如果您更新/远离 Ecto,您的所有测试都会中断
  • @SaschaWolf 我没有测试 ecto。我正在测试我的函数build。它建立了查询。我正在测试它是否正确构建查询。
  • @script 我理解,但您的测试取决于Ecto.Query 的内部实现。因此,即使业务逻辑仍然正确,当 Ecto 更改实现时,您的测试也会中断。这就是我说你测试 Ecto 时的意思。
  • @SaschaWolf 当然这个库将依赖于 ecto 版本并且会负责更新

标签: testing elixir ecto


【解决方案1】:

一种可能性是使用Ecto.Adapters.SQL.to_sql/3 检查生成的 SQL:

assert Ecto.Adapters.SQL.to_sql(
  :all, repo, build(QM.Test.Model, opts)
) == {"SELECT ... WHERE first_name LIKE '$1'", ["%Ham %"]}

【讨论】:

  • 感谢您的建议。请你再看看这个问题。我更新了它。也许您可以就解决方案提出更好的建议。
  • 我认为 mudasobwa 的建议应该足以回答您的问题,您还缺少什么来解决您的问题?
  • @script 我没有发现问题有任何重大变化。此外,正如您已经多次被告知的那样,任务本身似乎是一个 XY 问题。你确实在测试Ecto。仅供参考,Ecto.Query 是一个结构。如果你想有一个“更好的解决方案”(不管它是什么意思),你可能会检查这个结构的字段,这些字段与你想要明确测试的内容相关,一个一个。
  • 我会避免测试内部字段,甚至测试生成的 SQL 查询。这样的测试可能随时中断,一个小的错误修复版本可能会改变内部逻辑并给您留下一个损坏的测试套件。仅依靠公共 API 即可实现稳定的测试。
【解决方案2】:

测试查询生成的最简单的方法是在测试中“手动”创建您期望的查询。

这样的测试可能如下所示:

expected_query = from m in QM.Test.Model, where: like(m.first_name, "%Ham %")
opts = %{
  "$where" => %{"first_name" => %{"$like" => "%Ham %"}}
}

assert build(QM.Test.Model, opts) == expected_query

这显然仍将您的测试与Ecto 耦合在一起。但这将确保您的测试不会因最小的版本更改而中断。只有主要版本会导致测试中断,但这样的版本也会导致应用程序损坏,这反过来又使这一点变得没有意义。

【讨论】:

  • 感谢您的回答。我已经试过了。它不适合我
猜你喜欢
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多