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