Strucuring unit tests
public class AddressValidator
{
public bool IsValid(IList<string> addressLines)
{
if (addressLines == null)
{
throw new ArgumentNullException("addressLines",
"AddressLines cannot be null");
}
if (addressLines.ElementAtOrDefault(0) != null &&
addressLines.ElementAtOrDefault(4) != null)
{
return true;
}
if (addressLines.ElementAtOrDefault(0) != null &&
addressLines.ElementAtOrDefault(1) != null &&
addressLines.ElementAtOrDefault(2) != null)
{
return true;
}
return false;
}
public bool IsNonUkAddress(IEnumerable<string> addressLines)
{
// return true for UK address
return false;
}
}
[TestClass]
public class AddressVaidatorTests
{
private AddressValidator _target;
[TestInitialize]
public virtual void TestSetup()
{
_target = new AddressValidator();
// other test setups that are common for all the tests in this file.
}
[TestClass]
public class TheIsValidMethod : AddressVaidatorTests
{
[TestInitialize]
public override void TestSetup()
{
base.TestSetup();
// additional test setups applicable for the current method under test
}
[TestClass]
public class WhenTheAddressIsNull : TheIsValidMethod
{
// add test initialiser here to setup anything that are
// applicable for the current scenario
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void ShouldThrowArgumentNullException()
{
// arrange
List<string> inputAddress = null;
// act
_target.IsValid(inputAddress);
// assert
// expected exception - ArgumentNullException.
}
// add test cleanups here
}
[TestClass]
public class WhenAddressLine1AndPostcodeArePresent : TheIsValidMethod
{
// add test initialiser here to setup anything that are
// applicable for the current scenario
[TestMethod]
public void ShouldReturnTrue()
{
// arrange
var inputAddress = new List<string>()
{
"Address1", null, null, null, "Postcode"
};
// act
var actual = _target.IsValid(inputAddress);
// assert
Assert.IsTrue(actual);
}
// add test cleanups here
}
// add test cleanups here
}
[TestClass]
public class TheIsUkAddressMethod : AddressValidator
{
// tests
}
[TestCleanup]
public virtual void TestCleanup()
{
// any cleanups
}
}