如果测试一些你的程序之外的东西就比较麻烦了。对于文件系统,你能建立临时目录,对于时间,你也可以设置假的时间。通常,如果你将所有的外部状态整合在一个尽可能小的地方,你以后的工作就容易多了:容易明白,容易测试,也容易替换为其它方案。
对于数据库就比较麻烦了。数据库存取遍及大多数需要访问数据库的代码。
在 Python 网络开发社区,比较通用的方法是在小型的 SQLite 数据库上运行测试集。这是一个好主意,除非你突然被限制到一个 SQL 子集,不然它能在 SQLite 和你的目标数据库上同样的工作。次好的方法是运行一个真实的实例然后就此打住。
然后你可能停在这儿,没有什么更好的办法了。即使对于带有非常复杂数据库的大型 App,似乎这也是你能做的最好的选择。你可能每个测试需要花掉 20 分钟去执行一个完全重复的 setup 或缓存或者其它什么东西,但是我也没有什么更好的主意了。
问题是数据库存取仍然通过 SQL,并且 SQL 完全是你通过网络传输的另一种编程语言。你要替换为一个进程内的 SQL 实现并不方便——这被叫做 SQLite。你能把所有的数据库存取隐藏在一个带有非常长的名字的函数中,并且复杂难懂的返回值只能在一个地方被调用,然后替换为一个测试桩,但是这一点也不好玩儿。特别地,它没有检查你的 SQL 是否正确。
如果你正在用 ORM,你稍微有一些机会,但是我从来没有看见一个 ORM 能在内存数据结构中原生执行查询。(我希望如此,好像这也在可能的范围内,但是它可能需要大量的工作并且仍旧没有覆盖所有角落的针对于你的数据库的函数和语法。)
我不知道,我一无所获。