Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 在ExUnit中测试库的查询_Testing_Elixir_Ecto - Fatal编程技术网

Testing 在ExUnit中测试库的查询

Testing 在ExUnit中测试库的查询,testing,elixir,ecto,Testing,Elixir,Ecto,我正在ExUnit中为此库测试查询(而不是查询返回的数据) 这是我的密码: test "returns the query where field like" do opts = %{ "$where" => %{"first_name" => %{"$like" => "%Ham %"}} } assert build(QM.Test.Model, opts) == end 该函数在控制台中返回的结果如下: left: #Ecto.Qu

我正在ExUnit中为此库测试查询(
而不是查询返回的数据)

这是我的密码:

 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 %")>
左:#exto.Query
这里的主要目标是查看
build
函数是否正确构建查询

我不是在测试外星人。我正在测试构建查询的函数

如何将此结果插入右侧的
,以使测试通过

任何建议


谢谢。

一种可能是使用以下方法检查生成的SQL:


测试查询生成的最不脆弱的方法是在测试中“手动”创建您期望的查询

其中一项测试可能如下所示:

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

这显然仍然会将您的测试与
exto
相结合。但它将确保您的测试不会因为最小的版本更改而中断。只有一个主要版本会导致测试失败,但这样的版本也会导致应用程序失败,这反过来又使这一点变得毫无意义。

您确定这是测试此逻辑的最佳方式吗?它可以测试内部的
exto.Query
,并将其与它的工作方式紧密结合,这使得它在更新
exto
时非常脆弱。它看起来不是一个好方法。。。您正在测试EXTO内部(已经测试过)-如果您更新/离开EXTO,您的所有测试都将break@SaschaWolf我不是在测试外星人。我正在测试我的函数
build
。这将建立查询。我正在测试它是否正确构建查询。@脚本我理解,但您的测试取决于
exto.query
的内部实现。因此,当Ecto更改实现时,您的测试将中断,即使业务逻辑仍然正确。这就是我所说的你测试Ecto时的意思。@SaschaWolf当然这个库将依赖于Ecto版本,并将负责更新谢谢你的建议。你能再看一下这个问题吗。我更新了它。也许你可以给出更好的解决方案建议。我认为mudasobwa的建议应该足以回答你的问题,你缺少什么来解决你的问题?@script我在问题中没有发现任何重大变化。而且,任务本身,正如你已经被告知过几次的那样,似乎有点像XY问题。您确实在测试
exto
。仅供参考,这是一个结构。如果您想要“更好的解决方案”(不管它是什么意思),您可以逐个检查此结构的字段,这些字段与您想要显式测试的内容相关。我将避免测试内部字段,甚至测试生成的SQL查询。这样的测试随时都可能中断,一个小的错误修复版本可能会改变内部逻辑,给您留下一个中断的测试套件。只有依靠公共API才能实现稳定的测试。谢谢您的回答。我已经试过了。这对我不起作用
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