模拟 - 方法和工具
Mocking - Methods & Tools
自学了gmock,了解了它的功能。如果我们可以模拟一些方法并测试我们的流程,那就太好了。
我现在的问题是我们有庞大的代码库,它为特定流程调用许多子模块接口 - 即底层 class 方法调用许多子模块/子子模块接口:
bool classA::methodA(uint64_t number) {
if (0 == number) {
return false;
}
Foo* p=&obj;
while (true && (p->*fptr)(number)) {
if (1 == number) {
return true;
} else if (0 == number%2) {
number = number / 2;
} else {
Printer* machine;
char* buff;
PTR pmf[2]= {&B::Copy, &B::Append};
(machine->*pmf[APPEND])(buff, number);
number = 3 * number + 1;
}
}
}
是否有一种方法/机制/经验法则可以用来识别/了解需要模拟以测试我的 class 100% 代码的子模块的所有方法?
这里不需要规定。您只需嘲笑需要嘲笑的事物。不多也不少。
记住:你编写单元测试的想法是在隔离中测试你的单元。这意味着您有时必须 "cut out" 您的单元对其他代码的依赖性。
现在假设您的代码使用了一些依赖项 B。
- 当您可以调用您的代码时,将真正的 B 保持在适当的位置 - 很好。那就做吧。
- 当 B 在您的单元测试设置 或 中失败时,您需要控制 B returns 对您的代码的影响- 那么你需要一个模拟。
从这个意义上说,经验法则是:如果必须的话,请模拟一些事情。
因此我们无法告诉您究竟要模拟什么。相反,你必须退后一步:
- 首先,了解您希望如何对您的代码进行单元测试
- 那你看看它的依赖关系
- 然后你可以试验当你调用你的代码时会发生什么没有任何模拟
- 然后根据前面步骤收集的数据得出结论
自学了gmock,了解了它的功能。如果我们可以模拟一些方法并测试我们的流程,那就太好了。
我现在的问题是我们有庞大的代码库,它为特定流程调用许多子模块接口 - 即底层 class 方法调用许多子模块/子子模块接口:
bool classA::methodA(uint64_t number) {
if (0 == number) {
return false;
}
Foo* p=&obj;
while (true && (p->*fptr)(number)) {
if (1 == number) {
return true;
} else if (0 == number%2) {
number = number / 2;
} else {
Printer* machine;
char* buff;
PTR pmf[2]= {&B::Copy, &B::Append};
(machine->*pmf[APPEND])(buff, number);
number = 3 * number + 1;
}
}
}
是否有一种方法/机制/经验法则可以用来识别/了解需要模拟以测试我的 class 100% 代码的子模块的所有方法?
这里不需要规定。您只需嘲笑需要嘲笑的事物。不多也不少。
记住:你编写单元测试的想法是在隔离中测试你的单元。这意味着您有时必须 "cut out" 您的单元对其他代码的依赖性。
现在假设您的代码使用了一些依赖项 B。
- 当您可以调用您的代码时,将真正的 B 保持在适当的位置 - 很好。那就做吧。
- 当 B 在您的单元测试设置 或 中失败时,您需要控制 B returns 对您的代码的影响- 那么你需要一个模拟。
从这个意义上说,经验法则是:如果必须的话,请模拟一些事情。
因此我们无法告诉您究竟要模拟什么。相反,你必须退后一步:
- 首先,了解您希望如何对您的代码进行单元测试
- 那你看看它的依赖关系
- 然后你可以试验当你调用你的代码时会发生什么没有任何模拟
- 然后根据前面步骤收集的数据得出结论