Login using System.Noticeably.Different.WebSite;
November 19, 2008 NoticeablyDifferent
Search for
 
Testing The Builder Pattern 
    #region Code
public class Director {
    IBuilder builder;
 
    public Director(IBuilder builder) {
        this.builder = builder;
    }
 
    public void Construct() {
        builder.BuildPart();
    }
}
 
public interface IBuilder {
    void BuildPart();
}
 
 
public class ConcreteBuilder : IBuilder {
    Product product = new Product();
 
    public void BuildPart() {
        product.Part = "Some value";
    }
 
    public Product GetResult() {
        return product;
    }
}
 
public class Product {
    private string part = string.Empty;
 
    public string Part {
        get { return part; }
        set { part = value; }
    }
}
    #endregion
 
    #region Unit Tests
public class MockBuilder : IBuilder {
    public bool buildPartCalled = false;
 
    public void BuildPart() {
        buildPartCalled = true;
    }
}
 
[TestFixture]
public class DirectorTests {
    Director director;
    MockBuilder builder;
 
    [SetUp]
    public void SetUp() {
        builder = new MockBuilder();
        director = new Director(builder);
    }
 
    [Test]
    public void ConstructCallsBuildPartInBuilder() {
        Assert.IsFalse(builder.buildPartCalled, "BuildPart not called");
        director.Construct();
        Assert.IsTrue(builder.buildPartCalled, "BuildPart called");
    }
}
 
[TestFixture]
public class BuilderTests {
    ConcreteBuilder builder;
 
    [SetUp]
    public void SetUp() {
        builder = new ConcreteBuilder();
    }
 
    [Test]
    public void GetResultDoesNotReturnNullObject() {
        Assert.IsNotNull(builder.GetResult());
    }
 
    [Test]
    public void BuildPartSetsPartInProduct() {
        Product productPriorToBuildPart = builder.GetResult();
        Assert.AreEqual(0, productPriorToBuildPart.Part.Length,
             "Product's Part initialized properly");
        builder.BuildPart();
        Product productAfterBuildPartCalled = builder.GetResult();
        Assert.AreEqual("Some value", productPriorToBuildPart.Part,
             "Product's Part affected properly by BuildPart");
    }
}
 
[TestFixture]
public class ProductTests {
    Product product;
 
    [SetUp]
    public void SetUp() {
        product = new Product();
    }
 
    [Test]
    public void PartSetAndRetrieved() {
        string someValue = "Some value";
        Assert.AreEqual(0, product.Part.Length,
             "Product value initialized");
        product.Part = someValue;
        Assert.AreEqual(someValue, product.Part,
             "Product value retrieved");
    }
}
    #endregion