单元测试大型非成员函数

时间:2010-09-22 22:23:24

标签: c++ unit-testing

我有一个功能,我想接受测试。但是,它非常大并且创建了一个有限状态机。该函数看起来大致如下:

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类)都是可测试的。

所以我的问题是:这样的功能可以接受测试吗?我不确定你甚至会验证这个功能是否按预期工作。我可以把它分成更小的函数来创建状态和转换。然而,刚刚创建这些状态的函数似乎也相当复杂且难以测试。

感谢。

1 个答案:

答案 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 /序列化方法,则非常有用。