我开始用C编写一个简单的程序,并希望将配置存储在磁盘上。为了方便适当和正确的单元测试,我想做一些事情来防止被测试代码实际上从磁盘读取和写入磁盘。
配置文件的格式为YAML。
程序的API可能看起来像这样:
myapp config
将转储整个配置。(这里有一个预先存在的配置文件/mock)
myapp config server
将转储服务器子密钥。(这里有一个预先存在的配置文件/mock)
myapp config server=example.com
将使用新值写入文件(无论是否是否存在预先存在的文件)
内部配置是一个简单的结构体,包含一些键、服务器主机、服务器端口和用户名,用户名用于进行一些API调用。
我一点也不担心文件在磁盘(目录)上的位置或getopt/CLI解析,只是如何模拟网络和文件系统操作对我来说很重要。
问题更进一步,那就是问什么技术可以用来存根网络。
我很可能会使用cmock和libcurl。
我的第一个想法是"也许我应该做一个像read_configuration_file()
这样的函数,我可以在我的单元测试中模拟",但我真的不确定这样做的优点,在ruby中存根文件系统的代码可能很容易:
File.stubs(:read).with('./configuration.yml').returns("---nserver: example.comn")
并且,从这个背景出发,用C
的术语思考,我发现是相当困难的。
我观察到似乎没有多少人在C中测试这些东西,或者更具体地说,如果他们做了——他们没有写关于它的文章。
注意:这不是一个家庭作业问题,它只是听起来有点像我写了整个东西之后,我实际上只是想学习C,来自Ruby背景;你可能会注意到我关于尝试做C
"正确"的话题的一些其他问题。
您可能想看看CUNIT的开发人员做了什么,看看您是否可以避免重新发明一部分轮子
http://sourceforge.net/projects/cunit/我认为你的前提
"为了促进适当和正确的单元测试,我想做防止被测代码实际读取,和写入磁盘。"
是错误的。您总是可以安排从新创建的空目录或任何您想要的预先安排的状态运行测试。这怎么可能以任何方式影响测试的正确性?