Для проверки указатель на функцию указывает на адрес функции. CMockery

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

File A.c

void (*FunctionPtr)(void) = &funcA;

void funcA()
{
  //calls func B 
   funcB();

}

TestA.c

void Test_A( void ** state )
{
   /// test for FunA
   // working as expected
}
void Test_FunctionPtr( void** state )
{
   /// how to check here that FunctionPtr holds memory location of funcA
  // I tried something like below
   assert_memory_equal( FunctionPtr, funcA(), sizeof( funcA() ) );

}

Во время выполнения я получаю сообщение об ошибке, и я понятия не имею, как ее устранить. Может быть, я использую неправильный API, чтобы утверждать, но не знаю, какой позвонить. Ниже моя ошибка
ошибка во время выполнения:
Test_FunctionPtr: запуск теста Нет записей для символа funcB.

1 ответ

Решение

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

Также вы хотите сравнить значение, сохраненное в FunctionPtr с адресом funcA, Вы не хотите сравнивать память где FunctionPtr указывает на с функцией.

Так что вместо assert_memory_equal( FunctionPtr, funcA(), sizeof( funcA() ) ); я хотел бы использовать assert(FunctionPtr == funcA);

Вы написали в своем комментарии, что вы используете assert_int_equal сейчас. Обратите внимание, что оба значения не являются int, так что если макрос использует printf с %d (или аналогичный) в случае ошибки вы вызываете неопределенное поведение.

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