For unit tests, is there a hackish way to change the value of a const variable?(对于单元测试,有没有一种更改const变量的值的黑客方法?)
问题描述
我有一个C++11头文件,它有一个声明为my_const_value
的常量值。以及一个名为GetValue
的函数,该函数使用const值运行复杂逻辑并返回期望值。
我想用my_const_value
的不同值对GetValue
进行单元测试。
我知道这不可取,但为了编写GetValue
的单元测试,我希望使用不同的my_const_value
值来测试GetValue
。在C++中是否有一些类似黑客的方法来更改常量的值,即使它是常量?
//MyHeader.hpp
namespace myheader {
const int my_const_value = 5;
int GetValue() {
// In real-world, lets say below line of code is a complex logic that needs to be tested by a unit test
return /my_const_value * 5) / 25;
}
}
#include "MyHeader.hpp"
#include <gtest/gtest.h>
TEST(MyHeaderTest, Testing_Something) {
EXPECT_EQ(1, myheader::GetValue()); // This is okay
// I want to test that in the future is the value of my_const_value changes to something else then
// myheader::GetValue returns the expected result. But of course, I cannot change my_const_value because it is a const.
// Is there a way to hack around this for a unit test? Is there a way that I could still hack and change the value of my_const_value?
myheader::my_const_value = 25;
EXPECT_EQ(5, myheader::GetValue());
}
我知道我可以const_cast
my_const_value
赋给一个非常量变量。但这在这里帮不上忙。如果有什么办法可以通过使用指针或其他方法来更改my_const_value
的值,那就回答了我的问题。
推荐答案
我知道您正在寻找如何丢弃常量的方法,但我可能会采取不同的方法。
你在评论中说:
好吧。我已经给出了我的理由。我正在测试
GetValue
中的逻辑。我已将my_const_value
声明为const
,但将来有人更改该值时,可以将其从5
更改为其他值。
如果变量是const
,并且在没有传递给它的情况下参与函数内的表达式,那么这些更改通常不应该定期发生,也不应该预期。如果将myheader::my_const_value
视为配置值,并且该配置值可能随时会更改,则应将其传递给在表达式中使用它的函数。
所以从测试的角度来看,我同意idclev 463035818答案中的建议,将函数分成两个部分,一个是带参数的可测试部分,另一个是使用常量的部分。
一个测试,用于测试代码当前的行为(它应该具有什么常量)
TEST(MyHeaderTest, Testing_Something1) {
EXPECT_EQ(5, myheader::my_const_value)
EXPECT_EQ(1, myheader::GetValue());
}
一个用于一般测试:
TEST(MyHeaderTest, Testing_Something2) {
EXPECT_EQ(1, myheader::GetValue_impl(5));
EXPECT_EQ(5, myheader::GetValue_impl(25));
// …
}
这样,如果GetValue
使用的计算起作用,您就有了通用测试。对于您代码的当前版本,myheader::GetValue()
的值是预期的值。
这篇关于对于单元测试,有没有一种更改const变量的值的黑客方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:对于单元测试,有没有一种更改const变量的值的黑客方法?
基础教程推荐
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31