2017-10-09 124 views
0

我正在通过unit testing the handle_{call,cast,info} callbacks测试GenServer。我的一个文档测试 S的如下:使用TDD的Ecto变更集和GenServers

@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将保持不变。

是否足够以某种方式文档测试changeset独立,然后将Repo.insert成给出测试通过GenServer

回答

1

正如你所提到的,你试图在DocTests中覆盖的功能有副作用,这是由于文档不足所致。

你可以找到更多的"When not to use doctest" section

一般来说,不推荐文档测试,当你的代码示例包含副作用...

+0

这个问题能解决由包括捕捉一些结果插入''handle_call'输出中 - 即插入不再成为副作用? – category

+1

如果你想尝试几种方法,我认为这可能是一个有趣的练习,但总的来说,我不认为这是你的情况下最好的方式。 Docs的主要目的实际上是记录行为,如果您开始影响您编写代码以使其在DocTests_中可测试的方式,那么您可能会暴露于内部的大部分内容以及实现方式。这感觉就像使文档变得难以访问。希望是有道理的! –

+0

谢谢你。这与先写测试的TDD方法相比如何,然后编写代码来明确通过测试? TDD不会导致设计为可测试的代码? – category