【问题标题】:Ecto changesets and GenServers using TDD使用 TDD 的 Ecto 变更集和 GenServer
【发布时间】:2017-10-09 18:00:45
【问题描述】:

我正在通过unit testing the handle_{call,cast,info} callbacks 测试GenServer。我的 doctest 之一如下:

@doc """                                                                                             
  Call the GenServer to retrieve the initial workout                                                   

  ## Examples                                                                                          
  iex> :rand.seed(:exsplus, {101, 102, 103})                                                           
  iex> Pullapi.GenServerWorker.handle_call({:initial_workout, 5}, nil, %{})                         
  {:reply,                                                                                             
  {:ok,                                                                                                
  [%{"Action" => "Pullups", "SequenceNo" => 0, "Units" => "1"},                                        
  %{"Action" => "Rest", "SequenceNo" => 1, "Units" => "60"},                                           
  %{"Action" => "Pullups", "SequenceNo" => 2, "Units" => "3"},                                         
  %{"Action" => "Rest", "SequenceNo" => 3, "Units" => "60"},                                           
  %{"Action" => "Pullups", "SequenceNo" => 4, "Units" => "3"},                                         
  %{"Action" => "Rest", "SequenceNo" => 5, "Units" => "70"}]}, %{}}                                    
  """

我想在迁移中实现的指定模式下插入对数据库的回复。但是,我不知道如何为此编写单元测试 - 因为 DB 写入本质上是一种副作用,所以上述 doctest 将保持不变。

以某种方式独立地doctest changeset,然后将 Repo.insert 放入 GenServer 中是否足够?

【问题讨论】:

    标签: tdd elixir ecto changeset gen-server


    【解决方案1】:

    正如您所提到的,您试图在 DocTests 中涵盖的功能有副作用,由于文档的原因,不鼓励这样做。

    您可以在"When not to use doctest" section中找到更多信息:

    一般来说,当您的代码示例包含副作用时,不建议使用 doctest...

    【讨论】:

    • 能否通过在handle_call 输出中包含插入的某些结果来解决这个问题 - 即插入不再成为副作用?
    • 如果您想尝试几种方法,我认为这对您来说可能是一个有趣的练习,但总的来说,我不会认为这对您来说是最好的方法。 Docs 的主要目的实际上是记录行为,如果您开始影响您编写代码的方式以使其在 DocTests 中可测试,您可能会接触到许多内部结构以及事情是如何实现的。这感觉就像模糊文档使其更难访问。希望这是有道理的!
    • 谢谢。这与先编写测试,然后编写代码以专门通过测试的 TDD 方法相比如何? TDD 不会导致设计为可测试的代码吗?
    • @category 抱歉没有具体说明,让我解决这个问题! TDD 是一项很棒的技术,您应该遵循它,我想说的是 - 您尝试进行的测试是有效的,您必须更细致地测试您的功能,但 DocTests 不是最好的地方这样做。这种测试应该在您的_test.exs 文件中处理。使用这种方法,您应该最终得到经过测试的代码(在测试文件中)和干净、易于理解的文档。这有意义吗?
    • 根据您在此处共享的一个函数的示例很难判断,但是是和否:将测试代码移动到测试文件(您要保留测试你的代码),并且no,在文档测试中留下“示例”部分(最后,这是文档,所以显示使用函数的方式是个好主意),但不要在您的测试套件中运行它们的示例(这实际上归结为从您的测试文件中修改或完全删除 doctest MyModule
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多