Login using System.Noticeably.Different.WebSite;
March 18, 2010 NoticeablyDifferent
Search for
 
Testing The State Pattern 
    #region Code
public abstract class State {
    public abstract void Handle(Context context);
}
 
public class ConcreteStateA : State {
    public override void Handle(Context context) {
        //Do something
    }
}
 
public class ConcreteStateB : State {
    public override void Handle(Context context) {
        //Do something different
    }
}
 
public class Context {
    private State state;
 
    public Context(State state) {
        this.state = state;
    }
 
    public State State {
        get { return state; }
        set { state = value; }
    }
 
    public void Request() {
        state.Handle(this);
    }
}
    #endregion
 
    #region Unit Tests
public class MockState : State {
    public override void Handle(Context context) {
        //Mock something
    }
}
 
public class SecondMockState : State {
    public override void Handle(Context context) {
        //Mock something
    }
}
 
[TestFixture]
public class ContextTests {
    private Context context;
    private State state;
 
    public ContextTests() { }
 
    [SetUp]
    public void SetUp() {
        state = new MockState();
    }
 
    [Test]
    public void InitialStateIsStateAssignedInConstructor() {
        context = new Context(state);
        Assert.AreSame(state, context.State);
    }
 
    [Test]
    public void RequestPerformsAssignedStateHandle() {
        context = new Context(state);
        context.Request();
        //Assert that the Handle method of MockState is called.
    }
 
    [Test]
    public void SetContextStateChangesState() {
        State secondState = new SecondMockState();
        context = new Context(state);
        Assert.AreSame(state, context.State, "State is first state");
        context.State = secondState;
        Assert.AreSame(secondState, context.State, "State is second state");
    }
}
    #endregion