【发布时间】:2021-07-07 17:08:32
【问题描述】:
我有一个模板类,它将data type T 和size_t size 作为模板化参数,并为客户端类编写了一些单元测试。我在两个不同的地方重复相同类型的代码,一个在夹具,另一个在 TYPED_TEST,以获取类型化参数。
在夹具中
using T = typename std::tuple_element_t<0, Tup>;
static constexpr std::size_t size = std::tuple_element_t<1, Tup>::value;
using ClientT = typename Client<T, size>::ClientT; // ClientT = std::array<T, size>
在 TYPED_TEST - ReturnTrueWhenComparedWithSameClientID
using T = typename std::tuple_element<0, decltype(TypeParam())>::type;
static constexpr std::size_t size = std::tuple_element_t<1, decltype(TypeParam())>::value;
using ClientT = typename Client<T, size>::ClientT; // std::array
客户
template <typename T, size_t size>
class Client {
public:
using ClientT = std::array<T, size>;
Client(const ClientT& ID) : ID(ID) {}
Client(const ClientT&& ID) : ID(std::move(ID)) {}
inline const ClientT& getID() const { return ID; }
inline bool isID(const ClientT& anotherID) const { return ID == anotherID; }
inline bool operator==(const Client& anotherClient) { return ID == anotherClient.getID(); }
private:
ClientT ID;
};
单元测试文件是这样的
template <typename Tup>
class ClientTest : public testing::Test {
using T = typename std::tuple_element_t<0, Tup>;
static constexpr std::size_t size = std::tuple_element_t<1, Tup>::value;
using ClientT = typename Client<T, size>::ClientT; // ClientT = std::array<T, size>
protected:
ClientTest() : id(ClientT{1}), client(std::make_unique<Client<T, size>>(id)) {}
~ClientTest() override {}
void setClient(const ClientT& id) { client.reset(new Client<T, size>(id)); }
ClientT id;
std::unique_ptr<Client<T, size>> client;
};
typedef testing::Types<std::tuple<std::int8_t, std::integral_constant<std::size_t, 16>>,
std::tuple<std::uint8_t, std::integral_constant<std::size_t, 24>>>
Implementations;
TYPED_TEST_CASE(ClientTest, Implementations);
TYPED_TEST(ClientTest, ReturnTrueWhenComparedWithSameClientID) {
using T = typename std::tuple_element<0, decltype(TypeParam())>::type;
static constexpr std::size_t size = std::tuple_element_t<1, decltype(TypeParam())>::value;
using ClientT = typename Client<T, size>::ClientT; // std::array
ClientT new_id{15};
this->setClient(new_id);
EXPECT_EQ(this->client->getID(), new_id);
EXPECT_TRUE(this->client->isID(new_id));
}
到目前为止,测试正在编译并且看起来不错。但我不喜欢重复相同的代码块两次
我想知道是否有一种方法可以将数据类型和大小从夹具继承到 TYPED_TEST 中,或者比现有的更好。
谢谢
【问题讨论】:
-
这可能会有所帮助,而且 SO 将在问题之间创建链接:stackoverflow.com/questions/17079702/…
标签: c++ unit-testing templates googletest