2015-05-12 3 views
1

Я оцениваю тестовый тест Google/Mock как основу для модульных тестов моего кода на языке C.Задание аргумента строки вывода с помощью GoogleMock

Как указать аргумент выходной строки для функции, которую я хотел бы высмеять?

Здесь у меня есть int get_int_param(const char *) - это функция для тестирования, и она использует функцию int _get_text_file_content(const char *fn, char *content), которую я хочу высмеять.

Как определить это char *content, что будет результатом выполнения функции издевательств?

я борюсь с этим кодом:

TEST(GetParameterTest,Positiv){ 
    const static int strLen=29; 
    char *text=(char *)calloc(strLen,1); 
    strcpy(text, "param1=1\nparam2=42\nparam3=3"); 

    MokedFunctions mokedFunctions; 
    EXPECT_CALL(mokedFunctions, _get_text_file_content("process.conf",_)).Times(AtLeast(1)).WillOnce(SetArgReferee<1>(text)); 

    EXPECT_EQ(1, get_int_param("param1")); 
} 

и получил эту ошибку компиляции:

/usr/include/gmock/gmock-more-actions.h: In instantiation of ‘typename 
testing::internal::Function<F>::Result testing::SetArgRefereeActionP<k, 
value_type>::gmock_Impl<F>::gmock_PerformImpl(const args_type&, 
arg0_type, arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, 
arg6_type, arg7_type, arg8_type, arg9_type) const [with arg0_type = 
const char*; arg1_type = char*; arg2_type = 
testing::internal::ExcessiveArg; arg3_type = 
testing::internal::ExcessiveArg; arg4_type = 
testing::internal::ExcessiveArg; arg5_type = 
testing::internal::ExcessiveArg; arg6_type = 
testing::internal::ExcessiveArg; arg7_type = 
testing::internal::ExcessiveArg; arg8_type = 
testing::internal::ExcessiveArg; arg9_type = 
testing::internal::ExcessiveArg; F = int(const char*, char*); int k = 1; 
value_type = char*; typename testing::internal::Function<F>::Result = 
int; testing::SetArgRefereeActionP<k, 
value_type>::gmock_Impl<F>::args_type = std::tuple<const char*, char*>]’: 

/usr/include/gmock/gmock-generated-actions.h:664:23: required from 
‘static Result testing::internal::ActionHelper<Result, 
Impl>::Perform(Impl*, const std::tuple<_U1, _U2>&) [with A0 = const 
char*; A1 = char*; Result = int; Impl = 
testing::SetArgRefereeActionP<1, char*>::gmock_Impl<int(const char*, 
char*)>]’ 

/usr/include/gmock/gmock-more-actions.h:168:1: required from 
‘testing::SetArgRefereeActionP<k, 
value_type>::gmock_Impl<F>::return_type 
testing::SetArgRefereeActionP<k, 
value_type>::gmock_Impl<F>::Perform(const args_type&) [with F = 
int(const char*, char*); int k = 1; value_type = char*; 
testing::SetArgRefereeActionP<k, 
value_type>::gmock_Impl<F>::return_type = int; 
testing::SetArgRefereeActionP<k, value_type>::gmock_Impl<F>::args_type 
= std::tuple<const char*, char*>]’ 

test_param.cpp:68:1: required from here 
/usr/include/gmock/gmock-more-actions.h:175:3: error: size of array is negative 
GTEST_COMPILE_ASSERT_(internal::is_reference<argk_type>::value, 
^ 
In file included from /usr/include/gmock/gmock.h:65:0, 
      from test_param.cpp:2: 
    /usr/include/gmock/gmock-more-actions.h:177:28: error: assignment of read-only location ‘std::get<1u, {const char*, char*}>((* & args))’ 
    ::std::tr1::get<k>(args) = value; 
         ^
    make[1]: *** [test_param.o] Error 1 

Что я делаю не так?

ответ

0

Вы используете среду тестирования C++ для кода C. Если вы не захотите скомпилировать свой код с g ++ (вместо gcc), это не сработает. Gcc не может скомпилировать код на C++.

+0

Да, конечно, я компилирую свой код C с помощью gcc, а затем скомпилирую свои тесты и свяжу их с g ++. Нет проблем, он работает неплохо. – evrdrkgrn0

+0

Хорошо, так вы делаете что-то вроде этого? http://stackoverflow.com/questions/19552805/using-google-mock-for-c-code – rost0031

+0

yep, мое решение немного грязно, но оно основано на этом сообщении – evrdrkgrn0

1

SetArgReferee ожидает, что аргумент будет ссылкой на C++, и это не ваше дело.

В общем, для того, чтобы лучше понять эти действия, это помогает думать о них, как операции над аргументом arg:

  • SetArgPointee(value) по существу *arg = value (arg должен быть указателем)
  • SetArgReferee(value) является arg = value (arg должно быть ссылкой)
  • SetArrayArgument(first, last) является memcpy(arg, first, last - first) (arg должно быть указателем)
  • SaveArg(ptr) является *ptr = arg
  • SaveArgPointee(ptr) является *ptr = *arg (arg должен быть указателем)

Учитывая это, становится очевидным, что действие нужно SetArrayArgument<1>(text, text + strlen(text) + 1).

Смежные вопросы