首页 > 解决方案 > 如何测试序列生成器是否会生成预期的项目?

问题描述

我有一个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_setwhich 不需要operator<但确实需要hash()实现。

BTWA::operator=已经在生产中实施。

我可以使用vectorand 和迭代来手动搜索,但这似乎有点笨拙。

我怎样才能优雅地编写这个测试而不必实现测试特定的操作符?

标签: c++unit-testingstlsetcontainers

解决方案


您可以简单地使用另一个容器和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版本一致。


推荐阅读