C Перестановка FFF - PullRequest
       7

C Перестановка FFF

0 голосов
/ 29 января 2020

Я пытаюсь использовать библиотеку насмешек FFF для C (https://github.com/meekrosoft/fff) для модульного тестирования C кода. Проблема, с которой я сталкиваюсь, заключается в том, что g cc рассматривает мой фиктивный объект как переопределение исходной функции и из-за этого выдает ошибки компилятора.

Я создал 2 файла тестирования, которые имитируют мои варианты использования. my_lib.c имеет определения некоторых внутренних функций. test.c импортирует my_lib.c, потому что цель состоит в том, чтобы протестировать все функции из исходного файла.

//my_lib.c

int thing = 0;

int get_thing () {
    return thing;
}

int do_thing (void) {
    return thing;
}

int set_thing (int x) {
    thing = x;
    return do_thing();
}

//test.c
#include "fff.h"
#include "my_lib.c"

DEFINE_FFF_GLOBALS;

FAKE_VALUE_FUNC0(int, do_thing);

void setup(void)
{
    // Reset the FFF call history between tests
    FFF_RESET_HISTORY();

    // Reset the FFF mock objects between tests
    RESET_FAKE(do_thing);
}

void test_do_thing(void)
{
    set_thing(11);

    ASSERT_EQ(1, do_thing_fake.call_count);
}

void test_nested_mock(void)
{
    do_thing_fake.return_val = -2;

    int ret = set_thing(11); //set_thing() returns do_thing() which is mocked to return -2

    ASSERT_EQ(-2, ret);
}

Я собираю в объектный файл следующим образом , но это дает мне немедленную ошибку компиляции:

$ gcc -g -c test.c -o test.o
In file included from test.c:1:0:
test.c:7:23: error: redefinition of ‘do_thing’
 FAKE_VALUE_FUNC0(int, do_thing);
                       ^
fff.h:1632:45: note: in definition of macro ‘DEFINE_FAKE_VALUE_FUNC0’
     RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void){ \
                                             ^
test.c:7:1: note: in expansion of macro ‘FAKE_VALUE_FUNC0’
 FAKE_VALUE_FUNC0(int, do_thing);
 ^
In file included from test.c:3:0:
my_lib.c:12:1: note: previous definition of ‘do_thing’ was here
 do_thing (void)
 ^

Мне нужно иметь возможность макетировать функции из исходных файлов, в то же время я могу тестировать устаревшие исходные файлы без изменения любого источника или заголовочные файлы. Чего мне не хватает с fff и / или g cc?

РЕДАКТИРОВАТЬ: Позвольте мне добавить это. Я мог бы удалить определение do_thing () из my_lib.c, а затем моя компиляция, макеты и тесты работают точно так, как ожидалось, потому что все вызовы do_thing теперь go для моего фиктивного объекта. Я хочу иметь возможность макетировать функцию, которая уже определена в тестируемом исходном коде.

...