【发布时间】:2011-02-05 12:33:18
【问题描述】:
我对测试很陌生,所以如果我在任何时候完全走错了方向,请告诉我。话虽如此,假设我想测试以下函数 foo。
int foo(int i) {
//Lots of code here
i = bar();
//Some more changes to i happen here, conditional on what bar returned
return i;
}
在这个例子中,foo和bar都是我自己写的函数,我已经测试过bar。
由于 foo 的输出是以 bar 的输出为条件的,我假设为了测试 foo,我需要创建一个 bar 的 mock。为了做到这一点,并假设 bar 的定义保存在与 foo 不同的源文件中,我可以创建一个新的源文件,包含它而不是找到 bar 的实际定义的源文件,然后放一个 mock该文件中的条形图。
int bar(void) {
return HARD_CODED_VALUE;
}
但是,这种方法存在两个问题:
1) 如果 bar 返回多个值(例如错误代码或实际值)并且我需要确保 foo 对每种可能性做出正确反应,会发生什么情况?我无法为 bar 创建多个定义。我确实有一个想法是在 bar 中创建一个静态 int ,然后在每次调用 bar 时递增它。然后我只是对这个 int 有一个条件,多次调用 bar 并因此返回多个值。但是,我不确定在模拟函数中引入更复杂的逻辑是否是一种好的做法,或者是否有更好的方法来实现这一点:
int bar(void) {
static int i = 0;
i++;
if(i == 1) {
return HARD_CODED_VALUE_1
}
else if(i == 2) {
return HARD_CODED_VALUE_2
}
else {
fprintf(stderr, "You called bar too many times\n");
exit(1);
}
}
2) 如果 bar 和 foo 在同一个源文件中会发生什么?我无法重新定义 bar 或分离 foo 和 bar 而不更改我的源代码,这将是一个真正的痛苦。
【问题讨论】:
-
可以在没有模拟 bar 函数的情况下对 foo 函数进行有效的单元测试吗?如果是这样,只需创建一个涵盖 foo 和 bar 组合功能的单元测试。
标签: c unit-testing