Проверка, если функция, протестированная с CMockery, вызывает другую конкретную функцию
Я столкнулся с проблемой при написании макета кода с использованием CMockery для функции, показанной ниже. Можете ли вы дать мне подсказку? Я хочу проверить, если startCalCompute
называется, а также присвоить значение updateMode
так что это не равно SYSTEM_CAL_CONFIG
, Все, что мне нужно, это отправная точка или подсказка.
foo.c
static void checkSystem(void)
{
#ifndef CAL
startCalCompute();
#endif
if( SYSTEM_CAL_CONFIG != updateMode )
{
updateLogevent();
}
...
}
testfoo.c
void Test_checkSystem( void ** state )
{
// what to do here to check if startCalCompute() is called ?
}
1 ответ
Я хочу присвоить значение
updateMode
так что это не равноSYSTEM_CAL_CONFIG
Если updateMode
зависит от значения, которое вы получаете от другой функции и хотите контролировать ее во время теста, тогда вам следует создать двойной тест этой функции. Вот хороший ответ, объясняющий, в частности, издевательства. Если он рассчитан полностью внутри checkSystem
, тогда тестовый драйвер не должен его модифицировать, так как его целью является только проверка общего результата.
checkSystem.c
/* checkSystem depends on a value returned by this function */
int getUpdateMode (void);
/* This function knows nothing about testing. It just does
whatever it was created to do. */
void checkSystem (void)
{
int updateMode = getUpdateMode ();
if (SYSTEM_CAL_CONFIG != updateMode)
{
...
}
}
test_checkSystem.c
/* When testing checkSystem, this function
will be called instead of getUpdateMode */
int mock_getUpdateMode (void);
{
/* Get a value from test driver */
int updateMode = (int) mock();
/* Return it to the tested function */
return updateMode;
}
void test_checkSystem_caseUpdateMode_42 (void ** state)
{
int updateMode = 42; /* Pass a value to mock_getUpdateMode */
will_return (mock_getUpdateMode, updateMode);
checkSystem (); /* Call the tested function */
assert_int_equal (...); /* Compare received result to expected */
}
Я хочу проверить, если
startCalCompute
называется
Если startCalCompute()
условно компилируется для вызова checkSystem()
тогда вы можете условно скомпилировать все, что вы хотите сделать в тестах:
void startCalCompute (void);
void checkSystem(void)
{
#ifdef CAL
startCalCompute();
#endif
}
void test_checkSystem (void ** state)
{
#ifdef CAL
...
#endif
}
Если вам нужно убедиться, что определенная функция была вызвана и это зависит от условий выполнения, или если некоторые функции были вызваны в определенном порядке, в CMockery нет инструментов для этого. Тем не менее, есть в CMocka, которая является вилкой CMockery и довольно похожа. Вот как вы это сделаете в CMocka:
checkSystem.c
void startCalCompute (void);
void checkSystem (void)
{
if (...)
startCalCompute ();
}
test_checkSystem.c
/* When testing checkSystem, this function
will be called instead of startCalCompute */
void __wrap_startCalCompute (void)
{
/* Register the function call */
function_called ();
}
void test_checkSystem (void ** status)
{
expect_function_call (__wrap_startCalCompute);
checkSystem ();
}
Сейчас если checkSystem
не буду звонить startCalCompute
тест провалится так:
[==========] Running 1 test(s).
[ RUN ] test_checkSystem
[ ERROR ] --- __wrap_startCalCompute function was expected to be called but was not.
test_checkSystem.c:1: note: remaining item was declared here
[ FAILED ] test_checkSystem
[==========] 1 test(s) run.
[ PASSED ] 0 test(s).
[ FAILED ] 1 test(s), listed below:
[ FAILED ] test_checkSystem