原文
以下文章基于AI翻译,不准确处请参考原文。
我们到底在说什么?
CMock是一个很好的小工具,它可以获取你的头文件并为它创建一个模拟接口,这样你就可以更容易地对模块进行单元测试。对于头文件中的每个函数原型,如下所示:
int DoesSomething(int a, int b);
…你得到一个自动生成的DoesSomething函数,你可以链接到它,而不是你真正的DoesSomething函数。通过使用这个模拟版本,您可以验证它是否接收到您想要的数据,并让它返回您想要的任何数据,让它在您想要的时候抛出错误,等等……为您最新的实际模块接触的所有东西创建这些,您就会突然处于一个强大的位置:您可以控制和验证您最新创建的每个细节。
为了使这更容易,CMock也给你一堆像下面的函数,所以你可以告诉生成的DoesSomething函数如何为每个测试行为:
void DoesSomething_ExpectAndReturn(int a, int b, int toReturn);
void DoesSomething_ExpectAndThrow(int a, int b, EXCEPTION_T error);
void DoesSomething_StubWithCallback(CMOCK_DoesSomething_CALLBACK YourCallback);
void DoesSomething_IgnoreAndReturn(int toReturn);
你可以把这些东西背靠背堆起来,它就会记住你想传递的内容,比如:
test_CallsDoesSomething_ShouldDoJustThat(void)
{
DoesSomething_ExpectAndReturn(1,2,3);
DoesSomething_ExpectAndReturn(4,5,6);
DoesSomething_ExpectAndThrow(7,8, STATUS_ERROR_OOPS);
CallsDoesSomething( );
}
这个测试将调用CallsDoesSomething,这是我们正在测试的函数。我们期望这个函数调用三次做某事。第一次,我们检查以确保它被称为DoesSomething(1,2),并神奇地返回一个3。第二次我们检查DoesSomething(4,5)并返回一个6。第三次我们验证做了一些事情(7,8),我们将抛出一个错误而不是返回任何东西。如果calls做的事情有任何错误,它将失败测试。如果你没有调用足够的,或调用太多,或使用错误的参数,或以错误的顺序调用,它将会失败。
CMock基于Unity,用于所有内部测试。它使用Ruby完成所有主要工作(版本2.0.0及以上)。
安装
要安装CMock,您需要做的第一件事是获取一个Ruby副本。如果您使用的是linux或osx,那么您可能已经拥有它了。你可以输入以下文字来证明:
ruby --version
如果它以一种暗示无知的方式回应,那么你就需要安装它。你可以去ruby-lang获取最新版本。如果它返回的版本大于2.0.0,您还需要这样做。去做吧。我们会等待。
一旦你有了Ruby,你有三个选择:
Install Ceedling (which has it built in!) through your commandline using gem install ceedling.
生成的Mock模块摘要
除了模拟本身之外,CMock还将生成以下函数,以便在测试中使用。expect函数总是生成的。其他函数只有在这些插件被启用时才会生成:
Expect:
你的基本订书钉将会在你的日常工作中使用。通过调用这个函数,您就告诉CMock您希望在测试期间调用这个函数。它还指定了您希望使用哪些参数调用它,以及在调用时您希望返回什么返回值。为了让多个调用排队,你可以连续多次调用这个函数。
void func(void) => void func_Expect(void)
void func(params) => void func_Expect(expected_params)
retval func(void) => void func_ExpectAndReturn(retval_to_return)
retval func(