使用TDD的Ecto变更集和GenServers
问题描述:
我正在通过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
?
答
正如你所提到的,你试图在DocTests中覆盖的功能有副作用,这是由于文档不足所致。
你可以找到更多的"When not to use doctest" section:
一般来说,不推荐文档测试,当你的代码示例包含副作用...
这个问题能解决由包括捕捉一些结果插入''handle_call'输出中 - 即插入不再成为副作用? – category
如果你想尝试几种方法,我认为这可能是一个有趣的练习,但总的来说,我不认为这是你的情况下最好的方式。 Docs的主要目的实际上是记录行为,如果您开始影响您编写代码以使其在DocTests_中可测试的方式,那么您可能会暴露于内部的大部分内容以及实现方式。这感觉就像使文档变得难以访问。希望是有道理的! –
谢谢你。这与先写测试的TDD方法相比如何,然后编写代码来明确通过测试? TDD不会导致设计为可测试的代码? – category