假设我决定用 C 或任何其他过程编程语言编写一个大型应用程序。它具有如下所示的调用依赖函数:
A
|
+-------------+
| |
B1 B2
| |
+------+ +------+
| | | |
C11 C12 C21 C22
显然,对叶子函数 C11、C12、C21 和 C22 进行单元测试非常容易:设置输入、调用函数、断言输出。
但是,为 B1、B2 和 A 启用良好的单元测试的正确策略是什么?
依赖注入是否会建议B1
(并且B2
也)声明如下?
// Declare B1 with dependency injection for invoking C11 and C12.
int B1(int input, int (*c11)(int), int(*c12)(int));
但是,如果我有多层调用,该策略似乎无法扩展。想象一下声明的A
样子:
int A(int input, int (*b1)(int, int (*)(int), int(*)(int)),
int(*b2)(int, int (*)(int), int(*)(int)),
int (*c11)(int),
int (*c12)(int),
int (*c21)(int),
int (*c22)(int));
呸!一定有更好的方法。
有时,我觉得 DI 和其他旨在促进模块化和易于维护的类似模式实际上阻碍了代码的清晰度,并使应该直接编码的内容变得复杂,变成了无意义的抽象和复杂的间接。
C 语言的大型软件项目,如 Perl 和 Ruby,如何处理单元测试?