我有一个功能,我想接受测试。但是,它非常大并且创建了一个有限状态机。该函数看起来大致如下:
std::auto_ptr<IFiniteStateMachine> CreateFSM()
{
std::auto_ptr<IFiniteStateMachine> = apFSM( new CFiniteStateMachine() );
std::list<IState*> listStates;
listState.push_back( new CStateFoo( /*params*/ ) );
listState.push_back( new CStateBar( /*params*/ ) );
// etc.
apFSM->AddState( listStates );
// Define the transition table
// 1st param: event received
// 2nd param: current state
// 3rd param: next state
apFSM->AddTransition( "EventA", "StateFoo", "StateBar" );
// etc.
return apFSM;
}
基本上,此函数只创建FSM,状态和转换表。每个单独的组件(IFiniteStateMachine和IState类)都是可测试的。
所以我的问题是:这样的功能可以接受测试吗?我不确定你甚至会验证这个功能是否按预期工作。我可以把它分成更小的函数来创建状态和转换。然而,刚刚创建这些状态的函数似乎也相当复杂且难以测试。
感谢。
答案 0 :(得分:0)
问问自己在函数运行后应该是什么?听起来在这种情况下应该有一个特定的状态机 - 这就是你应该检查的东西,所以你可以做类似的事情:
FSM expectedFSM = Factory.blankFSM().addState().addTransition().... etc
FSM actualFSM = CreateFSM();
ASSERT(expectedFSM == actualFSM); //assuming such == exists
或者有时更简单的方法是使用字符串represntation / serialization:
String expectedFSMStr = loadFSMFromFile(expectedOutput1);
FSM actualFSM = CreateFSM();
ASSERT_EQUALS(expectedFSMStr, actualFSM.toString());
这可以更容易调试,如果您的类具有可靠的toStrinb /序列化方法,则非常有用。