const 값이 .NET으로 선언 된 C ++ 11 헤더가 있습니다 my_const_value
. 그리고 GetValue
const 값을 사용하여 복잡한 논리를 실행하고 예상 값을 반환하는 함수가 있습니다.
GetValue
다른 값 으로 단위 테스트하고 싶습니다 my_const_value
.
나는 이것이 바람직하지 않다는 것을 알고 있지만에 대한 단위 테스트를 작성하기 위해 다른 값으로 GetValue
테스트 GetValue
하고 싶습니다 my_const_value
. const라도 const 값을 변경하는 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
non_const 변수를 사용할 수 있다는 것을 알고 있습니다. 하지만 여기서는 도움이되지 않습니다. my_const_value
포인터 등을 사용하여 값을 변경하는 해킹이 있으면 내 질문에 답할 수 있습니다.
나는 당신이 const를 버리는 방법을 찾고 있다는 것을 알고 있지만 아마도 다른 방법으로 갈 것입니다.
당신은 당신의 코멘트에서 말한다 :
잘. 나는 내 이유를 제시했다. 에서 논리를 테스트하고
GetValue
있습니다. 나는my_const_value
a로 선언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()
예상되는 값 이면 하나입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다