1

有没有办法将我的项目切换为使用 rake 作为其构建系统?我有一个使用 Make 作为其构建系统的大型项目,并希望为单元测试添加 CMock 功能(我已经成功使用 Unity),但没有找到有关将 CMock 与 Makefiles 集成的信息(相反,似乎世界刚刚如果他们希望 CMock 与他们的项目一起工作,则接受使用 Ruby 的 rake 作为他们的构建系统)。

我已经能够运行 CMock 示例测试,其中包括一个(似乎未完成?)“制作”示例。

我已将“make_example”中的测试代码修改为以下内容:

#include "mock_foo.h"
#include "unity.h"

void setUp(void) {}

void tearDown(void) {}

void test_main_should_initialize_foo(void) {
        foo_init_Ignore();
        TEST_IGNORE_MESSAGE("TODO: Implement main!");
}

但是,当从带有 Makefile 的文件夹中运行“make”时,UNITY_LINE_TYPE 似乎是未定义的(例如,我的依赖链中缺少某些东西):

make
mkdir -p ./build
mkdir -p ./build/obj
ruby ../../scripts/create_makefile.rb --silent
cc -o build/test/obj/test_main.o -c test/test_main.c -DTEST -I ./src -I /home/user/Documents/gitrepos/cmock/vendor/unity/src -I /home/user/Documents/gitrepos/cmock/src -I ./build/test/mocks 
In file included from test/test_main.c:1:0:
./build/test/mocks/mock_foo.h:27:27: error: unknown type name ‘UNITY_LINE_TYPE’
 void foo_init_CMockExpect(UNITY_LINE_TYPE cmock_line);
                           ^
build/test/MakefileTestSupport:29: recipe for target 'build/test/obj/test_main.o' failed
make: *** [build/test/obj/test_main.o] Error 1

有没有人使用 Makefiles 和 CMock 成功地实现了一个项目?

4

3 回答 3

1

原来我是我自己的一些 vim/clang 格式配置的受害者。

如果在您的测试实现中将“unity.h”导入放在“mock_xxx .h”之前, make_example(虽然开箱即用不是很有用)确实可以使用 CMock 的模拟框架正确编译和运行测试(我敢肯定)在某处的文档中被调用)。

以下是一个工作测试的示例(从 cmock/examples/make_example 稍微修改了 test_main.c):

#include "unity.h"
#include "mock_foo.h"

void setUp(void)
{
}

void tearDown(void)
{
}

void test_main_should_initialize_foo(void)
{
    foo_init_Expect();
    foo_init();
}

但是,由于我的 vim/clang 格式设置为“SortIncludes: true”,我的包含被重新排序以生成:

#include "mock_foo.h" // <---- the mocks must be included *after* unity.h
#include "unity.h"

void setUp(void)
{
}

void tearDown(void)
{
}

void test_main_should_initialize_foo(void)
{
    foo_init_Expect();
    foo_init();
}

就像我在 vim 中的 :wq 一样。

当然,这会导致 CMock 问题,因为它需要在尝试生成 mock_foo.h 之前弄清楚 unity.h 定义,所以我收到了上面发布的错误:

...
In file included from test/test_main.c:1:0:
./build/test/mocks/mock_foo.h:27:27: error: unknown type name ‘UNITY_LINE_TYPE’
 void foo_init_CMockExpect(UNITY_LINE_TYPE cmock_line);
...

我的 Makefile(与 CMock 示例无关),供后代使用:

CC ?= gcc
BUILD_DIR ?= ./build
SRC_DIR ?= ./src
TEST_DIR ?= ./test
TEST_BUILD_DIR ?= ${BUILD_DIR}/test
TEST_MAKEFILE = ${TEST_BUILD_DIR}/MakefileTestSupport
OBJ ?= ${BUILD_DIR}/obj
OBJ_DIR = ${OBJ}

default: all

all: setup test ${BUILD_DIR}/main run

setup:
    mkdir -p ${BUILD_DIR}
    mkdir -p ${OBJ}
    ruby ../../scripts/create_makefile.rb --silent

clean:
    rm -rf ${BUILD_DIR}

${BUILD_DIR}/main: ${SRC_DIR}/main.c ${SRC_DIR}/foo.c
    ${CC} $< -o $@

run:
    ./build/main || true

test: setup

-include ${TEST_MAKEFILE}

我发现 UNITY_LINE_TYPE 是在 unity.h 中定义的,并注意到 unity.h 是如何包含在我的测试中的,看到它被包含'mock_foo.h' 之后(对我来说还没有问题),我发现这种情况正在发生,然后与一些工作 rake 示例(在 ../temp_sensor 中)进行比较,我注意到所有 'unity.h' 包含在所有 'mock_xxx .h ' 包含之前(我还没有用 vim 触及这些。)

不要让你的工具成为傻瓜。

于 2017-08-05T23:36:43.350 回答
1

这个错误刚刚被修复:https ://github.com/ThrowTheSwitch/CMock/pull/211

现在您不需要保持#include 指令的特定顺序。

于 2019-03-22T09:46:56.360 回答
0

您的里程可能会有所不同,但我发现将我的包含与换行符分组会导致 clang 格式在组内排序,从而允许我在开始时保留重要的标题。通常这也具有一定的逻辑意义。

例如,在我的 test_xyz.c 文件中:

#include "unity.h"

#include "support/logging.h"
#include "crc.h"
#include "mock_unistd.h"

排序为:

#include "unity.h"

#include "crc.h"
#include "mock_unistd.h"
#include "support/logging.h"
于 2018-08-24T14:09:56.000 回答