私有(private)成员的 C++14 单元测试(解除)分配

标签 c++ performance unit-testing dependency-injection c++14

我有一个 deactivate() 方法,除其他外,它应该释放类的一个私有(private)成员(最终是一个 std::vectorresize(0) + shr​​ink_to_fit() - 但这并不重要)。

如果测试无法访问私有(private)成员以对其进行检查,我该如何进行单元测试以确认该成员已被 deactivate 方法释放?

我正在努力避免依赖注入(inject),因为代码对性能至关重要,而且我对通过引用/指针的间接访问和内联优化的潜在损失持谨慎态度。但如果有一些魔法可以避免这些缺点,我完全赞成!

我不反对检查原始内存使用情况,但当然这对于在堆上分配的成员(如 std::vector)来说并非易事,而且我不知道有什么办法去做。

我已经阅读了很多关于测试 private 成员的帖子(滥用 friend,编译时有条件地声明 protected/public),但我希望有人可以为这种更受限制的情况提供更漂亮的解决方案,或者提供一种无需间接和内联丢失的依赖注入(inject)方法。

最佳答案

一种简单、有效和高效的方法是添加公共(public) const getter 函数,这些函数返回对私有(private)成员变量或其属性的/const 引用的拷贝。

考虑 std::vector 本身。它被设计成一种非常高效的元素访问类型(与动态分配的数组一样快),但它有许多类似 getter 的函数,例如 empty()size() 等。我有 99.999% 的信心,其中一些不会被您的代码使用(例如 get_allocator()),但我敢打赌您不会梦想只是滚动自己的 vector 类以“性能”的名义删除它们。

请记住,单元测试是关于测试对象的接口(interface),而不是它们使用特定的数据结构来实现它们的逻辑。因此,我建议公开 vector 数据成员的关键属性而不是 vector 本身。

关于私有(private)成员的 C++14 单元测试(解除)分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45537512/

相关文章:

c++ - 智能指针,或 "better"析构函数

C++ 错误 C2893 : Failed to specialize function template

javascript - 按需加载图像而不改变 src 属性

sql - 临时表和 SQL SELECT 性能

javascript - angularJS:单元测试给出:未知提供者:$httpProviderProvider <- $httpProvider

unit-testing - 为什么这个 Assert 会失败?

c++ - 是否可以在 OpenCV 中查看函数 filter2D() 的内部?

c++ - 如何防止窗口暂时调整大小?

javascript - 优化 jQuery 以避免 Safari : “This webpage is using significant energy...”

c# - 如何在 Visual Studio 2015 中使用资源文件