Cmock не распознает вызовы функций

Я новичок в Cmock насмешливые рамки в Cи пытается начать его использовать. Я взял 'make_example' из каталога exmaples и немного его изменил. Мой код появляется под:

/////////////////////////// foo.c ///////////////////////////
#include "foo.h"

int foo_init(int number)
{
    return 0;
}

int func_using_foo_init(int number)
{
    int ret = -1;

    ret = foo_init(number);
    return ret;
}
//////////////////////////////////////////////////////

/////////////////////////// test_main.c ///////////////////////////

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

void setUp(void)
{
}

void tearDown(void)
{
}

void test_main_should_initialize_foo(void)
{
    int ret = -1;
    foo_init_ExpectAndReturn(1, 0);

    ret = func_using_foo_init(1);
    TEST_ASSERT_FALSE(ret);
}
//////////////////////////////////////////////////////

при выполнении показанного теста я получаю следующую ошибку:FAIL:Function func_using_foo_init. Called more times than expected.

Кроме того, если я добавляю вызов func_using_foo_init_ExpectAndReturn, я получаю следующую ошибку:Function foo_init. Called less times than expected.

кажется, что вызовы функций не распознаются.. любая помощь будет высоко ценится! LIAD

1 ответ

Макет - это сгенерированный код, имеющий такую ​​же сигнатуру функции, что и функция, над которой вы работаете. В результате вы не можете скомпилировать и связать макетированную функцию и исходную реальную функцию в одном исполняемом тестовом файле. C знает только, как скомпилировать и связать целые исходные файлы. Он не может выбирать функции внутри модулей, чтобы смешивать их вместе.

Проще говоря, это означает, что вы не можете делать поддельные вызовы функции, которая находится в том же исходном файле, который вы пытаетесь протестировать. Это фундаментальное правило основанного на взаимодействии тестирования в C. В целом это приводит к лучшему дизайну (особенно в больших проектах), но у него есть побочный эффект большего количества файлов (идут с более длинными описательными именами файлов) и иногда произвольного разделения кода среди файлов для включения насмешек.

Следовательно, лучший совет - вырезать foo_init() в отдельном файле от test_using_foo_init().

Вообще говоря, любой исполняемый файл теста будет состоять из одного исходного модуля и одного или нескольких фиктивных модулей, сигнатуры функций которых находятся за пределами источника, который вы тестируете. В простейшем случае вам нужно как минимум два отдельных модуля (один исходный и один смоделированный) для тестирования с помощью имитаций.

Другие вопросы по тегам