问题标签 [cmock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - XCTest 的自动 C/C++ 模拟生成 - CMock/OCMock?
我想使用 XCode 5 使用 C 和 C++ 进行开发。我特别喜欢 XCTest 和 Xcode 的集成以及使用 OSX Server 获得的 CI 功能。我想要一个模拟框架,理想情况下是自动生成模拟的框架,因为这似乎最有可能确保模拟遵循标准格式(并且它们本身不会出错)。
Q1。我看不出 OCMock 如何用于模拟 C 和 C++:这可能吗?
Q2。CMock 看起来很棒,但它依赖于 Unity。是否可以将 CMock 集成到 XCTest 中?
Q3。请问有人有其他建议吗?
c - 如何将 CMock/Unity 与 Automake 集成?
这是我第一次在这里提问,所以如果我可以改进我的问题,请告诉我..
我正在寻找有关如何干净地构建需要用 CMock 生成的源文件的模拟版本替换源文件的单元测试的指导。这是必需的,因为 CMock 要求使用模拟的单元测试代码与模拟源链接而不是原始源。
例如,如果我正在测试在测试源文件 test.c 中调用 foo() 的函数 test_me(),那么要模拟 foo(),我将不得不编译test_test_me: test_me.c, Mockfoo.c, and test.c.
test_me() 通常编译为test_me: test_me.c and foo.c
Mockfoo.c 是使用 CMock 使用 foo.h 提供的 Ruby 脚本生成的。
如您所见,foo.c
必须替换Mockfoo.c
为才能创建测试程序,test_test_me
. 需要 Mockfoo.c 以便 test_test_me 可以链接到 foo 的模拟调用,而不是原始的 foo 调用。当依赖项的数量增加时,替换源变得困难。
例如,如果 test_me 使用库 libfoo.a 中的 foo、bar 和 baz,它由 foo.o、bar.o 和 baz.o 组成,并且我只想模拟对 foo 的调用,那么我需要构建libfoo.a 与编译单元 Mockfoo.o、bar.o 和 baz.o 然后链接到test.o
使用模拟 foo 调用的 my。当你有 mock 的排列(例如 Mockfoo、Mockbar,但不是 baz)和具有不同 automake 规则、标志等的大型源树时,这会变得更加复杂。
此外,模拟的添加必须简单,因为我们的单元测试经常需要模拟。
一些上下文:
在重构代码或将新代码添加到我刚刚加入的大型 C 项目的情况下,我有兴趣使用CMock/Unity添加单元测试。
该项目目前使用 Automake 作为其构建工具,并且将继续存在。
我是 Automake 的新手。我熟悉 SCons 和 CMock。
c - 单元测试和实现之间的重复代码
我目前正在用纯 C 语言为嵌入式平台开发一些低级驱动程序。我使用 unity+cmock 作为单元测试框架。
但是,在编写低级内容时,我经常遇到以下模式:
测试:
执行:
如您所见,测试和实现之间的代码有很多重复。
这是一个问题吗?我写错了我的测试吗?或者我不应该为这些低级的东西编写测试?
c - Ceedling 如何将定义传递给 CMock
我对 TDD 有点陌生,尽管我已经使用 C 有一段时间了。因此,我使用 ceedling 来测试我的嵌入式项目。
我可以rake test:all
在 gcc 中,但我现在正试图将其移至嵌入式目标模拟器。我通过“project.yml”文件指定我的交叉编译器、链接器等。
当 Irake test:all
时,“编译 cmock.c”时出现错误(其他几个文件编译没有问题):
< path_to_cmock >/cmock.c:17:31: 错误:数组 'CMock_Guts_Buffer' 的大小太大
在此之后还有其他错误,但这是引发它们的错误。
当我转到 时cmock.c
,我在文件顶部看到这个:
完美,所以我只需要找到这些声明的位置。我进行了文本搜索,却发现它们没有在任何地方声明……所以我怀疑它们来自 ceedling 中的默认值。
我找到了 CMOCK 的文档,并在“编译选项”下,
还存在许多用于自定义 cmock 体验的#defines...
它继续列出我在源代码中找到的#defines,但没有说明在哪里可以找到它们。我试图用适当的定义制作一个包含文件,并通过“project.yml”传递包含文件,但没有成功。
我怀疑答案非常简单,只是在我搜索过的任何地方都没有概述。感谢您的时间,
c - CMock 通过 CLI 额外包含
在 Unity 之上将 CMock 引入我们的构建系统(基于 make) 我一直在努力正确地将额外的包含头文件移交给 cmock。我们不想使用配置 YML 文件,因为我们喜欢在 Makefile 中包含所有配置内容。因此,当通过 CLI 参数调用 cmock ruby 脚本时,我坚持移交所有配置。这适用于 mock_prefix 和 mock_path。截至目前,移交包含附加包含标头的数组失败。Makefile 中的调用如下所示:
这导致在 shell 上调用
以 YML 的形式移交配置与内部给出的几个包含头一起工作。通过使用 CLI 配置单个附加包含标头也有效,仅传递多个文件失败。有人有将数组交给 cmock 的经验吗?
感谢您的支持!
c - 在 MSVC (Visual Studio) 中模拟 C 函数
我正在阅读几篇关于模拟 C 函数(如CMock或CMocka)的文章,但我不确定在此过程中如何用模拟函数替换实际函数。例如,CMocka 依赖于使用 GNU 编译器的自动包装,该编译器支持--wrap
将__wrap
前缀附加到函数调用或允许您覆盖任何您喜欢的符号的弱符号等参数。
但是对于几乎所有其他框架,您如何在 Visual Studio 中执行此操作?
例如,CMock 有一个类似的例子(这里简化了很多):
还有实际的实现,它包含链接器应该在实际应用程序中找到的实际功能:
现在,在测试期间,Ruby 脚本会创建模拟函数,例如:
但是如果 VS 项目已经包含
parsestuff.c
了,那么调用 from 怎么可能myfunc.c
结束MockParseStuff.c
呢?这是否意味着我不能
parsestuff.c
包含在单元测试项目中?但如果是这种情况,那么也不可能模拟,例如,MyFunc
在myfunc.c
任何测试中,因为我已经必须包含文件才能测试它?
(更新)我也知道我可以包含.c
文件而不是.h
文件,然后做一些预处理器的东西来替换原来的调用,比如:
但这似乎是很多管道,我什至没有看到任何地方提到它。
c - CMock - 多个定义
我开始从事测试驱动的 C 开发工作。
我使用 CMock 通过运行以下命令来生成我的模拟类:
我目前的包结构是:
我有 CMakeLists.txt 设置来将 src 编译为库:
测试设置为编译为可执行文件:
并且 mocks 设置为编译为库:
我已经为模拟标题尝试了多个位置并且一直在玩,但是我错过了如何不出现多重定义错误的基本知识。
任何人都可以就我的文件结构或策略的不正确之处提供一些指导吗?
c - 如何在 C 中模拟同一 UUT 中的函数
我正在学习在现有的嵌入式 C 代码库(我可以调整以适应)上使用 Ceedling 和用于模拟的 CMock 进行单元测试。
我遇到过这样一种情况,一个单元中的一个函数调用同一单元中的第二个函数。
我不想测试foo_a()
作为测试的一部分foo_b()
。我如何模拟foo_a()
以便我仍然可以测试它是否被调用但不测试foo_a()
函数本身?
c - 如何将 CMock 单元测试框架与 Make 集成
有没有办法将我的项目切换为使用 rake 作为其构建系统?我有一个使用 Make 作为其构建系统的大型项目,并希望为单元测试添加 CMock 功能(我已经成功使用 Unity),但没有找到有关将 CMock 与 Makefiles 集成的信息(相反,似乎世界刚刚如果他们希望 CMock 与他们的项目一起工作,则接受使用 Ruby 的 rake 作为他们的构建系统)。
我已经能够运行 CMock 示例测试,其中包括一个(似乎未完成?)“制作”示例。
我已将“make_example”中的测试代码修改为以下内容:
但是,当从带有 Makefile 的文件夹中运行“make”时,UNITY_LINE_TYPE 似乎是未定义的(例如,我的依赖链中缺少某些东西):
有没有人使用 Makefiles 和 CMock 成功地实现了一个项目?