Login using System.Noticeably.Different.WebSite;
November 19, 2008 NoticeablyDifferent
Search for
 
Testing The Chain Of Responsibility Pattern 
    #region Code
public abstract class Handler {
    protected Handler successor;
 
    public Handler() { }
 
    public Handler(Handler successor) {
        this.successor = successor;
    }
 
    public Handler Successor {
        set { successor = value; }
    }
 
    public virtual void HandleRequest() {
        if (successor != null) {
            successor.HandleRequest();
        }
    }
}
    #endregion
 
    #region Unit Tests
public class MockExtendedHandler : Handler {
    private bool requestHandled = false;
 
    public MockExtendedHandler() : base() { }
    public MockExtendedHandler(Handler successor) : base(successor) { }
 
    public new Handler Successor {
        get { return successor; }
    }
 
    public override void HandleRequest() {
        requestHandled = true;
        base.HandleRequest();
    }
 
    public bool RequestHandled {
        get { return requestHandled; }
    }
}
 
[TestFixture]
public class HandlerTestFixture {
    Handler handler;
 
    [SetUp]
    public void SetUp() {
        handler = new MockExtendedHandler();
    }
 
    [Test]
    public void HandleRequestCompletesSuccessfullyWhenNoSuccessorIsSet() {
        try {
            handler.HandleRequest();
        } catch {
            Assert.Fail();
        }
    }
 
    [Test]
    public void HandleRequestOnHandlerPassesOffToSuccessor() {
        Handler successor = new MockExtendedHandler();
        handler = new MockExtendedHandler(successor);
        handler.HandleRequest();
        Assert.IsTrue(((MockExtendedHandler)successor).RequestHandled);
    }
 
    [Test]
    public void SetAccessorSetsSuccessor() {
        Handler successor = new MockExtendedHandler();
        handler.Successor = successor;
        Assert.AreEqual(successor, ((MockExtendedHandler)handler).Successor);
    }
 
    [Test]
    public void ConstructorOverloadSetsSuccessor() {
        Handler successor = new MockExtendedHandler();
        handler = new MockExtendedHandler(successor);
        Assert.AreEqual(successor, ((MockExtendedHandler)handler).Successor);
    }
}
    #endregion