使用TDD的Ecto更改集和GenServers

时间:2017-10-09 06:18:07

标签: tdd elixir ecto changeset gen-server

我正在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给出测试通行证?

1 个答案:

答案 0 :(得分:1)

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

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

  

通常,当您的代码示例包含副作用时,不建议使用doctests