问题标签 [cmockery]

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.

0 投票
1 回答
2755 浏览

gcc - 编译 cmockery.c 时,如何解决 GCC“错误:从 'SourceLocation*' 转换为 'int' 失去精度”错误?

我需要使用Cmockery将单元测试添加到用作手工制作的 Makefile 的现有构建环境中。所以我需要弄清楚如何构建 cmockery.c(没有 automake)。

当我运行时:

我得到一长串这样的错误:

这是 cmockery.c 的第 247:248 行:

assert_true在 cmockery.h 的第 154 行定义:

所以问题(如错误状态)是GCC不喜欢从'SourceLocation *'到'int'的转换。

./configure我可以使用and构建 Cmockery make(在 Linux上,如果我首先在 Mac OS X 上export CFLAGS=-I/usr/include/malloc),没有任何错误。我尝试查看运行时编译 cmockery.c 的命令行make(之后./configure):

...但我没有看到任何可能解决此错误的选项。

在“错误:从 'void*' 转换为 'int' 失去精度”中,我看到我可以将(int)cmockery.h 更改为(intptr_t). 我已经确认这是有效的。./configure但是由于我可以使用and构建 Cmockery make,因此必须有一种方法可以在不修改源代码的情况下构建它。

0 投票
4 回答
4464 浏览

c++ - 如何编译 C++ 代码并将其与已编译的 C 代码链接?

我希望能够使用Cmockery来模拟从我正在测试的 C++ 代码调用的 C 函数。作为朝着这个方向迈出的一步,我将 Cmockery 示例run_tests.c重命名为 run_tests.cpp,并尝试编译并将其与 cmockery.c 链接:

前两个命令行(编译)是成功的,但在最后一个之后我得到:

该未定义符号来自 run_tests.cpp 的第 29 行:

run_tests() 函数在 cmockery.c 中定义。

在阅读了“ Linking C++ code with 'gcc' (without g++) ”之后,我尝试了:

但得到了相同的结果:

如何编译和链接 C++ 代码以便在 C 代码中找到符号?

0 投票
2 回答
1082 浏览

c++ - 从 C++ 调用 C 函数时,如何告诉 gcc 放宽对类型转换的限制?

我正在尝试使用Cmockery来模拟从 C++ 代码调用的 C 函数。因为 SUT 使用 C++,所以我的测试需要使用 C++。

当我像这样使用 Cmockery expect_string() 宏时:

我得到:

我在cmockery.h中看到了 expect_string 的定义:

这是 _expect_string 的原型(来自 cmockery.h):

我认为问题在于我将 C 代码编译为 C++,因此 C++ 编译器反对(void*)string将 expect_string_count 宏作为const char* string参数传递给 _expect_string() 函数。

我已经extern "C"在 my_tests.cpp 中使用了 cmockery.h ,如下所示:

...为了解决名称修改问题。(请参阅“如何编译和链接 C++ 代码与已编译的 C 代码? ”)

是否有命令行选项或其他方式告诉 g++ 如何放宽对从我的测试的 C++ 代码到 cmockery.c 中的 C 函数的类型转换的限制?

这是我目前用来构建 my_tests.cpp 的命令:

0 投票
1 回答
726 浏览

c - CMockery 模拟,重复符号错误

我遇到了 CMockery 模拟的问题,即出现重复符号警告。

代码的实现很长,所以它在 Gist here中。

Gist 包括测试 ( .c)、实现 ( .c) 和头文件,项目使用 构建CMake和测试CTest,使用CMockery.

实际错误是:

我能够想出的解决方法是声明char *wit_configuration_file_path()static. 由于实现与int wit_load_configuration(wit_configuration config)我预期的实现在同一个文件中,因此它实际上可以干净地编译和链接。不幸的是,并且可能作为声明为静态的副作用wit_configuration_file_path(),它从不使用模拟。

cmockery的谷歌示例太做作了,没有解释应该如何处理这个问题。

将函数声明为 not as 也可能更智能,更容易测试:

而是:

在这种情况下,我不需要模拟或存根任何东西;但我相信问题会回来咬我,因为我预计将来我需要模拟一些东西(否则怎么能写出全面的单元测试?)

1:我应该如何正确地做到这一点,这static意味着它从不使用我的模拟,在没有static导致重复符号错误的情况下声明它。

2:我应该改变我的 API 的设计吗?它适用于这种情况,但我想知道如何正确模拟函数。

3:将我的测试与我的整个库链接起来是不是一个错误,我正在使用 CMake,target_link_libraries(libwatcheditTest watchedit)的测试中的CMakeLists.txt.

更新:在这里添加了更多构建输出以帮助诊断

0 投票
1 回答
1274 浏览

c - 我如何在我的项目中使用 cmockery

我一直在寻找一种使用 c 代码创建模拟对象的方法,直到我偶然发现了 cmockery。对我来说,它似乎是最好的模拟软件,因为它没有很多依赖项。

我在 ubuntu 工作并从https://code.google.com/p/cmockery/downloads/list下载了 tarball cmockery

我运行了 ./configure、make 和 make install。

我能够执行给定的示例,但我无法弄清楚如何让它在我自己的项目中运行。我查看了 configure 和 makefile 以尝试找出他们是如何做到的,但这没有成功。我认为这是导致我的问题的链接。

cmockery 的文件可以在以下位置找到:

我尝试将示例文件calculator.c 和calculator_test.c 复制到一个单独的目录并在那里编译它们。这就是我所做的:

在最后一步,我得到了很多未定义的对特定于 cmockery 的所有函数的引用和错误:

我想我把链接器搞砸了,但我找不到任何地方应该如何正确地完成它。

0 投票
2 回答
2044 浏览

c - 在 cmocka 中临时启用和禁用功能包装的正确方法?

我正在使用cmocka库来测试一些嵌入式 c 代码。根据文档,我使用__wrap_前缀来模拟函数,这样我就可以隔离我的单元测试。但是,一旦我这样做了,对函数的所有调用都将永远转到包装函数。如何在某些情况下重新启用实际功能,以便我可以对其进行测试或允许其他功能使用它?在我看来,唯一的方法是使用全局字段作为开关来调用真正的函数,如下所示:

这是正确的方法吗?

0 投票
1 回答
2959 浏览

c - Cmocka - 错误:没有符号条目

我刚开始使用 Cmocka,我已经在这个问题上停留了一段时间。我有一个正在尝试构建的 cmocka 项目。当我尝试使用“make”时,我看到了错误。

[ 错误 ] --- 没有符号 __wrap_i2c_read 的条目。

此外,我在调用的行的 mock_i2c.c 文件中看到错误mock()

无法获得模拟函数 __wrap_i2c_read 的值。

现在我只是想模拟一个真/假值来让它工作。所以我的模拟看起来像

我在我的测试中检查了我正在打电话will_return(__wrap_i2c_read, true);

在我的 Makefile 中,LDFLAGS += -Wl,--wrap=i2c_read 我已经cmocka.h包含在 mock_i2c.c 文件中。

对于这个模拟函数,这似乎不是一个问题,因为如果我不使用它,我会在该文件中的其他模拟函数中得到相同的错误。我不确定还需要什么其他信息,请告诉我。有人知道这是什么意思/以前见过吗?

谢谢。

编辑:所以我想我已经弄清楚为什么会出现这个错误。我正在测试的函数中有一个for循环。从这个函数调用模拟函数。一旦我删除循环,错误就会消失。这可能与will_return模拟值如何/何时排队有关吗?for循环阻碍了?

Edit2:好的,看来我只是没有排队足够的模拟值。

0 投票
1 回答
826 浏览

c - 检查用 CMockery 测试的函数是否调用另一个特定函数

我在使用 CMockery 为如下所示的函数编写模拟代码时遇到问题。你能给我一些提示吗?我想测试是否startCalCompute被调用并为 赋值updateMode,使其不等于SYSTEM_CAL_CONFIG。我需要的只是一个起点或提示。

foo.c

testfoo.c

0 投票
1 回答
288 浏览

c - 使用 Cmockery 验证函数指针是否相等

我正在编写单元测试,想知道如何使用 Cmockery 测试函数指针。

交流电

测试A.c

在运行时我收到错误,我不知道如何解决这个问题。可能是我使用了错误的 API 来断言,但不知道该调用哪一个。

以下是我的错误:

0 投票
1 回答
1278 浏览

cmake - CMockery 编译未知类型名称“jmp_buf”

我正在尝试将单元测试框架 cMockery 添加到我的 C 项目中。我已将 cMockery 下载并安装到全局包含路径中。但是#include <cmockery.h>在我的源文件中之后,cmake 抛出了以下问题。如果我也使用它,似乎会抛出同样的东西cMocka。我错过了一些包裹吗?

编辑:谷歌搜索"/usr/include/google/cmockery.h:365:8: error: unknown type name ‘jmp_buf’"正好返回0 个结果(现在 1 个结果指向这个问题)。以及搜索unknown type name 'jmp_buf'只解释它是什么。不是如何修复它或为什么它会在 cmockery 中发生。

操作系统:Manjaro Archlinux

Cmake、make、gcc、g++ 全部安装。

CMakeList.txt的也很标准,只有一个 c 源代码

我想知道如何解决这个问题以编译我的代码。