Проверка, если функция, протестированная с 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
Другие вопросы по тегам