2013-04-12 32 views
1

我是C#和他们的单元测试设备的新手。我写了使用state模式的状态机GoFUnittest a statemachine

public class Program 
{ 
    private static void Main() 
    { 
     var c = new Context(SimpleStateMachine.StateInit); 
     c.Run(); 
     Console.Read(); 
    } 
} 

public static class SimpleStateMachine 
{ 
    public static void StateInit(Context context) 
    { 
     // ... do some init 
     context.State = StateConfigure; 
    } 
    public static void StateConfigure(Context context) 
    { 
     // do some conifigure 
     context.State = StateMeasurement; 
    } 
    public static void StateMeasurement(Context context) 
    { 
     // do some measurement 
     context.State = GetMeasurement()? StateConfigure : StateFinished; 
    } 
    public static void StateFinished(Context context) 
    { 
     // do some deinit 
     context.State = (Action<Context>)null; 
    } 
} 

public class Context 
{ 
    public Action<Context> State { get; internal set; } 

    public Context(Action<Context> state) 
    { 
     State = state; 
    } 

    public void Run() 
    { 
     while (State != null) 
     { 
      State(this); 
     } 
    } 
} 

如何正确测试这种的statemachine?这个具体的状态机只是一个示例实现。正确的实现有更多的状态和转换条件。

回答

1

有多种方法可以做到这一点。

如果您确实使用严格的“状态机”模式,则需要通过monads处理副作用。

如果你只是希望经过几年的投入,以测试状态,你可以给它一些输入,然后测试你希望它是在该州。

+0

我编辑我的问题有一个更复杂的' FSM'。 FSM本身根据输入文件实施测量。在任何情况下,最后一个状态应该是FinishState。但是如何测试正确的状态顺序?另外如何测试每个状态被调用的正确时间? – Razer

+0

@Razer,你可以模拟出各个状态,以确定每次输入后状态是否正确。 – Codeman