Awhile back, Ayende Rahien posted about Assert.True as a tool of last resort. It was a great post (if you're into testing, which if you're a developer, I'm assuming you are, you should read it) and I chimed in about a pattern that bothered me:
... bool handled = false; try { something; } catch(Exception ex) { handled = true; } Assert.IsTrue(handled); ...
Tests are meant to ensure appropriate behavior. Our methods validate their contracts early by testing the parameters passed in. If I am expecting something not to be null, and you give me a null, it's my obligation as your friend to pass back an ArgumentNullException
instead of letting it flow through until you get a NullReference
.
Someone replied about a helper method and I had that "slap forehead" moment because I hadn't thought of this:
private delegate void ExceptionDelegate(); private static bool _ExceptionExpected(Type exceptionType, ExceptionDelegate method) { bool retVal = false; try { method(); } catch(Exception ex) { retVal = ex.GetType() == exceptionType; } return retVal; } ... Assert.IsTrue(_ExceptionExpected(typeof(ArgumentNullException), () => targetClass.TargetMethod(null)));
A lot cleaner and reusable ... and I'm confident someone reading this will come back with something even more elegant, but for now, I like it!