【问题标题】:Specifying output string argument with GoogleMock使用 GoogleMock 指定输出字符串参数
【发布时间】:2015-05-12 09:09:35
【问题描述】:

我正在评估 Google Test/Mock 作为我的 C 代码单元测试的框架。

如何为要模拟的函数指定输出字符串参数?

这里我有 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

我做错了什么?

【问题讨论】:

    标签: c unit-testing googletest googlemock


    【解决方案1】:

    SetArgReferee 期望参数是 C++ 引用,这不是你的情况。

    一般来说,为了更好地理解这些操作,将它们视为对参数 arg 的操作会有所帮助:

    • SetArgPointee(value) 本质上是*arg = valuearg 必须是指针)
    • SetArgReferee(value)arg = valuearg 必须是引用)
    • SetArrayArgument(first, last)memcpy(arg, first, last - first)arg 必须是指针)
    • SaveArg(ptr)*ptr = arg
    • SaveArgPointee(ptr)*ptr = *argarg 必须是指针)

    鉴于此,很明显您需要的操作是SetArrayArgument&lt;1&gt;(text, text + strlen(text) + 1)

    【讨论】:

      【解决方案2】:

      您正在为 C 代码使用 C++ 测试框架。除非你愿意用 g++(而不是 gcc)编译你的代码,否则它是行不通的。 Gcc 无法编译 C++ 代码。

      【讨论】:

      • 是的,我正在用 gcc 编译我的 C 代码,然后编译我的测试并将它们与 g++ 链接。没问题,效果很好。
      • 好的,你在做这样的事情吗? stackoverflow.com/questions/19552805/…
      • 是的,我的解决方案有点脏,但它基于这篇文章
      • 行内 EXPECT_CALL(mokedFunctions, _get_text_file_content("process.conf", _ )).Times(AtLeast(1)).WillOnce(SetArgReferee(text));你有一个下划线作为参数。我不是 google mock 专家,所以我可能会遗漏一些东西,但这看起来不对。
      • ::testing::_ 是来自 GMock 的通配符。这意味着期望有任何正确类型的值。我对此的理解是:“我希望所有正确的指针都作为输入”,然后我想在这个指针处指定输出,而输出又是预定义的(SetArgReferee)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      相关资源
      最近更新 更多