【问题标题】:Make 2 pointer point to the same adress with google tests actions使用 google 测试操作使 2 个指针指向同一个地址
【发布时间】:2021-05-03 09:45:50
【问题描述】:

我需要测试g_ascii_strtoll失败并将两个指针设置为相同值的情况,将errno设置为0并返回0(根据文档:“如果字符串转换失败,则返回零,并且 endptr 返回 nptr(如果 endptr 不为 NULL)”)(即使在我的情况下 output_str = NULL)
我要测试的代码:

gchar* output_ptr= NULL;
gchar* input_ptr= "f";
result = g_ascii_strtoll(input_ptr, &output_ptr, 10);

我的谷歌测试 sn-p:

const gchar* nptr;
EXPECT_CALL(mock_gstring, g_ascii_strtoll(_,_,_)).WillOnce( DoAll(SaveArg<0>(&nptr), SetArgReferee<1>((char)*nptr), SetErrnoAndReturn(0,0))  );

基本上,我只想做*output_ptr= (gchar *)input_ptr;,但使用 Google 测试操作,但我无法使其工作......

【问题讨论】:

    标签: unit-testing glib googlemock


    【解决方案1】:

    我不知道你的情况,所以这可能不相关,但这里有两点(这两点都没有真正回答你的 googlemock 问题,抱歉):

    • 您可能会发现g_ascii_string_to_unsigned()g_ascii_strtoll() 更易于使用。对于将整个字符串解析为整数的主要用例,它具有等效的功能。
    • GLib 中的函数在unit tests for GLib 中进行了测试,因此您不需要编写自己的重复测试。但是,如果您在 GLib 中发现了一个错误并正在对其进行测试,请考虑reporting it upstream,这样每个人都可以受益。

    【讨论】:

    • 感谢您的反馈!不幸的是,我没有机会选择要测试的功能,但我会向我的团队推荐它。我们必须为所有开发提供单元测试,但我会去检查他们在 GLib 单元测试中的表现
    • 为什么不直接运行 GLib 单元测试?
    • 因为它是一个更大项目的一部分,我们需要用相同的框架覆盖整个项目。 TBH,我被要求这样做,而且我还是新来的工作,所以我没有问太多......
    【解决方案2】:

    最后我用Invoke(f)解决了这个问题。
    所以,而不是:

    const gchar* nptr;
    EXPECT_CALL(mock_gstring, g_ascii_strtoll(_,_,_)).WillOnce( DoAll(SaveArg<0>(&nptr), SetArgReferee<1>((char)*nptr), SetErrnoAndReturn(0,0))  );
    

    我这样做了:

    void ut_pointer_cpy(const gchar *nptr, gchar **endptr, guint base){
        *endptr= (gchar *)nptr;
    }
    EXPECT_CALL(mock_gstring, g_ascii_strtoll(_,_,_))
                .WillOnce( DoAll(Invoke(ut_pointer_cpy), SetErrnoAndReturn(0,0))  );
    

    您在Invoke 中调用的函数必须与您模拟的函数具有相同的参数,或者改用Unused 键(我没有测试此选项)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-10
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      相关资源
      最近更新 更多