GoogleTest 枚举类的测试错误打印

2024-05-14

我正在使用 GoogleTest 版本 1.7.0 来测试我的 C++ 应用程序。我有一个枚举定义如下

namespace MyNamespace {
    enum class MyEnum {
        MyEnumValue,
        MyEnumValue2
    }
}

GoogleTest 错误地打印了它的值,导致测试失败时出现此错误消息:

值:MyClass.MyMethodThatReturnsEnum()

实际:4字节对象

预期:MyEnum::MyEnumValue

即:4字节对象

删除class关键字使用枚举的实际值生成正确的错误消息。这是 GoogleTest 的已知行为/错误吗?有办法解决这个问题吗?

MyClass my_class;

EXPECT_EQ(MyEnum::MyEnumValue, my_class.MyMethodThatReturnsEnum());

当您在中定义常量时enum class MyEnum你将它们定义为对象用户定义类型 MyEnum没有隐式转换 到任何整数类型。那就是goal of enum class这不是 让 Googletest 假设您想要类型的对象MyEnum自动地 转换为整数类型以便插入到输出 流,如果您选择将该类型设为enum class不仅仅是 一个enum.

所以你观察到的不是 Googletest 错误。这只是 Googletest 使用它的 某种类型的用户定义对象的后备表示T为此

std::ostream & operator<<(std::ostream &, T const &);

未定义。

如果你想查看类型对象的整数值enum class MyEnum对于出现在Googletest的诊断中的测试,您至少有两种方法。

一种方法是简单地将测试应用于基础积分值的物体, 如:

主要.cpp (1)

#include <gtest/gtest.h>
#include <type_traits>

enum class MyEnum {
    Value,
    Value2
};

auto as_integral(MyEnum me)
-> std::underlying_type<MyEnum>::type
{
    return static_cast<std::underlying_type<MyEnum>::type>(me);
}

TEST(foo,bar)
{
    EXPECT_EQ(as_integral(MyEnum::Value),as_integral(MyEnum::Value2));
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

编译、链接并运行:

$ g++ -std=c++11 -Wall -Wextra -o gtester main.cpp -lgtest  -lpthread
$ ./gtester
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from foo
[ RUN      ] foo.bar
main.cpp:17: Failure
Expected equality of these values:
  as_integral(MyEnum::Value)
    Which is: 0
  as_integral(MyEnum::Value2)
    Which is: 1
[  FAILED  ] foo.bar (0 ms)
[----------] 1 test from foo (1 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (1 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] foo.bar

 1 FAILED TEST

另一种更好的方法是向 Googletest 提供以下定义:

std::ostream & operator<<(std::ostream &, MyEnum const &);

这适合你。然后 Googletest 将在诊断中使用它,如下所示:

主.cpp (2)

#include <gtest/gtest.h>
#include <type_traits>
#include <ostream>

enum class MyEnum {
    Value,
    Value2
};

auto as_integral(MyEnum me)
-> std::underlying_type<MyEnum>::type
{
    return static_cast<std::underlying_type<MyEnum>::type>(me);
}

std::ostream & operator<<(std::ostream & out, MyEnum me)
{
    return out << as_integral(me);
}

TEST(foo,bar)
{
    EXPECT_EQ(MyEnum::Value,MyEnum::Value2);
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

编译、链接并运行:

$ g++ -std=c++11 -Wall -Wextra -o gtester main.cpp -lgtest  -lpthread
$ ./gtester
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from foo
[ RUN      ] foo.bar
main.cpp:23: Failure
Expected equality of these values:
  MyEnum::Value
    Which is: 0
  MyEnum::Value2
    Which is: 1
[  FAILED  ] foo.bar (0 ms)
[----------] 1 test from foo (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] foo.bar

 1 FAILED TEST
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GoogleTest 枚举类的测试错误打印 的相关文章

  • 带有 ASP.NET 按钮回发的 jQuery UI 对话框

    我的 ASP NET 页面上有一个运行良好的 jQuery UI 对话框 jQuery function jQuery dialog dialog draggable true resizable true show Transfer hi
  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 如何使用T4从一个模板同时生成两个文件?

    我遇到的情况是 我需要生成两个 CSharp 代码文件 它们的代码几乎相同 但方法的输入和输出类型的命名空间不同 事实上 每个文件都针对特定国家 地区 并且类型来自特定国家 地区的 WSDL 我正在围绕服务编写一些包装器 逻辑完全相同 但从
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是一样的吗?

    当我看到以下工作时我有点困惑 struct A void g void f g 但后来我发现this https stackoverflow com a 16323119 5825294答案非常详细地解释了它是如何工作的 本质上 它归结为t
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS
  • 如何从Python枚举类中获取所有值?

    我正在使用 Enum4 库创建一个枚举类 如下所示 class Color Enum RED 1 BLUE 2 我要打印 1 2 作为某处的列表 我怎样才能实现这个目标 您可以执行以下操作 e value for e in Color

随机推荐

  • 为什么 javac 为最终字段插入 Objects.requireNonNull(this) ?

    考虑下面的类 class Temp private final int field 5 int sum return 1 this field 然后我编译和反编译该类 gt javac version javac 11 0 5 gt jav
  • 新创建的Python虚拟环境中的默认库

    我使用 python 创建了一个新的虚拟环境virtualenv tool virtualenv venv 然后我激活了虚拟环境 source venv bin activate 然后我做了一个pip freeze这就是我得到的 venv
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 将属性应用于返回值 - 在 F# 中

    在 C 中 可以将属性应用于方法的返回 return DynamicAttribute public object Xyz return new ExpandoObject 这在 F 中可能吗 背景 我想要一个用 F 编写的库的方法 该方法
  • Netbeans 中的 Java 应用程序与 Java 桌面应用程序 [重复]

    这个问题在这里已经有答案了 可能的重复 Netbeans GUI 编辑器生成自己难以理解的代码 https stackoverflow com questions 2561480 netbeans gui editor generating
  • 如何为有效号码指定 DCG?

    我正在尝试为有效数字指定 DCG 如下所示 value Number gt valid number Number 基本上检查指定的值是否是数字 它也可能是变量 因此有必要检查 我不知道如何构建这个valid number不过 DCG 谓词
  • Windows 事件日志权限

    我需要授予用户哪些权限才能写入 Windows 事件日志 我有一个 ASP NET 应用程序需要模拟用户 并且模拟的用户必须能够写入事件日志 要创建事件日志源 您需要成为管理员 否则您应该能够在没有提升权限的情况下写入它 也许看一下本文 h
  • 从 ADF Faces JSF 1.2 中的托管 bean 构造函数导航

    是否可以从托管 bean 的构造函数导航到另一个页面 视图 如果发生任何异常 我希望进行此重定向 我尝试了很多方法 Try 1 getFacesContext responseComplete getFacesContext getAppl
  • 如何在 RxJS 订阅方法中等待

    在 RxJS 主题的订阅回调内部 我想要await on an async功能 下面是打字稿转译器抱怨的代码示例 错误 131 21 TS2304 找不到名称 await async ngOnInit this subscriber dat
  • 类型“never”上不存在属性“click”。 TS2339

    根据有关 TypeScript 此类错误的其他类似问题 关于问题 44147937 https stackoverflow com questions 44147937 property does not exist on type nev
  • ngrx 存储是否持久?

    ngrx 存储是否持久 换句话说 我们可以关闭浏览器重新打开它 并检索添加到ngrx 商店 https github com ngrx platform 目前 ngrx store 不支持此类功能 但是您可以通过使用类似的库来维护状态ngr
  • 使用 Cassandra 进行单元版本控制

    我的应用程序使用 AbstractFactory 作为 DAO 层 因此一旦实现了 HBase DAO 系列 创建 Cassandra DAO 系列并从多个角度查看差异对我来说将是非常好的 不管怎样 试图做到这一点 我看到 Cassandr
  • 用于集成测试的 Spring-boot 默认配置文件

    Spring boot利用弹簧型材 http docs spring io spring boot docs current reference html boot features profiles html它允许针对不同的环境进行单独的
  • 如何在不包含 MicrosoftAjax.js 的情况下使用 MicrosoftMvcValidation.js?

    如果您想使用 jQuery Validate 但不想使用主要的 Microsoft AJAX 那么 MVC 2 RC1 中似乎存在问题 即使压缩后 它也有 25kb 根据 Phil Haack 的说法 你应该能够只需包含这些脚本 http
  • 如何为已编译的 MATLAB 创建安装程序并要求用户接受我们的许可条款?

    我正在 MATLAB 中编写程序分发给 Windows 用户 我使用 MATLAB 编译器和 MATLAB r2014a 版本来创建程序 我可以使用 MATLAB 应用程序编译器创建 Windows 安装程序 并且它的工作效果可以接受 但是
  • 显示在 Angular 5 中作为 Blob 对象接收的图像

    我正在开发一个 MEAN Stack 应用程序 我想做的是显示存储在数据库中的图像 这样后端就可以工作 但我真正的问题是在前端Angular所以我这样做了 首先从后端接收图像 我做了一个服务来做到这一点 Function to get us
  • 被拒绝:将映像推送到 gitlab 注册表时,请求的资源访问被拒绝

    我正在尝试将图像推送到 gitlab 注册表 我已经做过很多次了 所以我想知道为什么会出现这个错误 我使用最新标签构建图像 Successfully tagged registry gitlab com mycompany rgpd api
  • 将 SWRL 与 Jena 和 Pellet 结合使用

    我无法找到一些使用 SWRL 和 Jena 的简单代码示例 佩莱 或者至少使用 SWRL 我研究了 Pellet 文档中的一些示例 但没有关于使用 SWRL 的示例 网络上的大多数示例都不完整且令人困惑 我找到的唯一解决方案是使用 Jess
  • 循环索引依赖于前一个索引

    我有一个清单 fruits apple orange blueberry strawberry 如何创建循环以使一个索引依赖于另一个索引 for i in range len fruits for j range len fruits i
  • GoogleTest 枚举类的测试错误打印

    我正在使用 GoogleTest 版本 1 7 0 来测试我的 C 应用程序 我有一个枚举定义如下 namespace MyNamespace enum class MyEnum MyEnumValue MyEnumValue2 Googl