我正在尝试使用CppUnit来测试一个只在第一次调用时才执行某些代码的方法。
class CElementParseInputTests: public CppUnit::TestFixture {
private:
CElement* element;
public:
void setUp() {
element = new CElement();
}
void tearDown() {
delete element;
}
void test1() {
unsigned int parsePosition = 0;
CPPUNIT_ASSERT_EQUAL(false, element->parseInput("fäil", parsePosition));
}
void test2() {
unsigned int parsePosition = 0;
CPPUNIT_ASSERT_EQUAL(false, element->parseInput("pass", parsePosition));
}
我想测试的递归方法:
bool CElement::parseInput(const std::string& input, unsigned int& parsePosition) {
static bool checkedForNonASCII = false;
if(!checkedForNonASCII) {
std::cout << "this should be printed once for every test case" << std::endl;
[...]
checkedForNonASCII = true;
}
[...]
parseInput(input, parsePosition+1)
[...]
}
由于对象被重新创建然后针对每个测试用例销毁,我希望在运行测试时,字符串“这应该为每个测试用例打印一次”将打印两次,但它只打印一次。我错过了什么?
答案 0 :(得分:5)
这就是static local variables应该做的事情。
在块作用域中使用指定符static声明的变量具有静态存储持续时间,但在控件第一次通过其声明时初始化(除非它们的初始化为零或初始化初始化,这可以在首次输入块之前执行) 。在所有进一步的调用中,将跳过声明。
这意味着checkedForNonASCII
只会在第一次通话时初始化为false
一次。对于进一步的调用,跳过初始化;即checkedForNonASCII
不会再次初始化为false
。
答案 1 :(得分:2)
另一个答案是什么。但这可能是你真正想要的:
bool CElement::parseInput(const std::string& input, unsigned int& parsePosition)
{
[...] // your code for validating ascii only characters goes here
if (hasNonAsciiCharacters) {
return false;
}
return parseInputInteral(input, parsePosition);
}
bool CElement::parseInputInternal(const std::string& input, unsigned int& parsePosition)
{
[...]
parseInputInternal(input, parsePosition+1);
[...]
return result;
}