9-文档、测试和管道
================
本章我们将实现“解析”功能,来解析在第一章提到的命令行操作指令(还记得吗?我们在写一个简易redis!):
```elixir
CREATE shopping
OK
PUT shopping milk 1
OK
PUT shopping eggs 3
OK
GET shopping milk
1
OK
DELETE shopping eggs
OK
```
解析功能完成后,我们会把代码更新到之前创建的```:kv```程序里面去。
## 文档测试(Doctests)
>Doctest常见于python,ruby等语言,是一种基于代码注释文档书写单元测试的方法。
用特定的语法为函数或方法书写注释,用doctest命令执行这些文档测试代码。
>注意:为了保证代码简洁,不能完全用doctest代替传统的单元测试代码
在语言官网首页,我们说Elixir视代码中的文档标记为语言中的一等公民。在文档手册中,我们也多次涉及这个概念。
比如经常在IEx命令行中执行```mix help```,以及输入```h Enum```或```h``` + 其他模块名字。
本章中,我们在实现上文所说“解析”功能的时候,引入文档注释的内容。它能够让我们直接通过代码的文档注释写测试,
有助于我们在文档注释中写出更准确的sample。
现在来创建我们的解析功能函数```lib/kv_server/command.ex```。先写doctest:
```elixir
defmodule KVServer.Command do
@doc ~S"""
Parses the given `line` into a command.
## Examples
iex> KVServer.Command.parse "CREATE shopping\r\n"
{:ok, {:create, "shopping"}}
"""
def parse(line) do
:not_implemented
end
end
```
Doctests规定的书写形式:在4空格缩进之后的```iex>```提示符后。
如果一个命令不止一行,则在除第一行的其它行用```...>```代替```iex>```字样。
命令的结果则写在```iex>```或```...>```的下一行,后面以一个新行或者下一个新的```iex>```行结束。
同时注意,我们写注释文档时用```@doc ~S"""```起头。```~S```可以保证文档里写的```/r/n```不会在执行doctests测试前被转义成回车。
执行doctets,我们先创建一个测试脚本```test/kv_server/command_test.exs```,
在用例中调用```doctest KVServer.Command```:
```elixir
defmodule KVServer.CommandTest do
use ExUnit.Case, async: true
doctest KVServer.Command
end
```