c++ - 如何测试序列生成器是否会生成预期的项目?
问题描述
我有一个B
生成的类A
。我知道在特定设置中,如果我调用它 3 次,它将生成A
( expected_a
) 的特定实例,但我不知道序列中的哪个位置。
我想编写一些单元测试代码,例如:
A expected_a(...);
B b;
std::set<A> set_of_a{ b.nextA() , b.nextA(), b.nextA() };
EXPECT_TRUE(set_of_a.count(expected_a) == 1);
但是使用 aset
需要实现A::operator<()
. operator<
可以很容易地实现,但是我正在编写生产代码来满足测试,这是我不喜欢/不想做的。
我尝试使用unordered_set
which 不需要operator<
但确实需要hash()
实现。
BTWA::operator=
已经在生产中实施。
我可以使用vector
and 和迭代来手动搜索,但这似乎有点笨拙。
我怎样才能优雅地编写这个测试而不必实现测试特定的操作符?
解决方案
您可以简单地使用另一个容器和std::count
:
A expected_a(...);
B b;
std::array<A, 3> arr_of_as{ b.nextA() , b.nextA(), b.nextA() };
EXPECT_TRUE(std::count(std::begin(arr_of_as), std::end(arr_of_as), expected_a) > 0);
你甚至不能存储它们:
A expected_a(...);
B b;
int count_a = 0;
for (int i = 0; i < 3; ++i) {
count_a += b.nextA() == expected_a;
}
EXPECT_TRUE(count_a > 0);
请注意,在这两个版本中,至少有一个expected_a
,但可能还有更多,这与您的set
版本一致。
推荐阅读
- angular - 使用 HTML 文件中的按钮重新启动 Angular 应用程序
- svg - 如何在没有抗锯齿的情况下在命令行上将 svg 导出为 png
- javascript - 使用 discord.js 播放音乐时的 miniget 状态码 416
- azure - Azure QnA 在 Facebook 聊天中显示 URL
- javascript - 如何解决布尔更改的承诺?
- python - 推荐的期刊或出版物以保持数据科学的最新状态?
- javascript - 如果日期值为空,则反应 js datepicker maxDate 处理
- java - Android为状态栏添加边距,重叠
- html - 我的 .htaccess 只在第一次工作,然后给我错误 500
- java - Hibernate 不插入子实体: Hibernate: select nextval ('hibernate_sequence')