In creating unit tests, we want to get maximum code coverage to make sure we are testing all possible scenarios and outcomes of our code. When we have a possible path of execution that leads into an exception being thrown, how do we build a test for that?
public class Book { // ... public void GoToPage(int page) { if (page < 1) throw new ArgumentException("Page must be a positive, non-zero integer", "page"); if (page > TotalPage) throw new ArgumentException("Page cannot be more than the total page count", "page"); // ... } // ... }So how do we test those boundary scenarios? We can do something like this:
[TestMethod] public void NegativePage_Exception() { // arrange var book = new Book(); // act try { // act book.GoToPage(-1); } catch (ArgumentException e) { // assert Assert.AreEqual("Page must be a positive, non-zero integer", e.Message); } catch (Exception) { Assert.Fail(); } }Or, you can write a more concise test such as this:
[TestMethod] [ExpectedException(typeof(ArgumentException), "Page must be a positive, non-zero integer")] public void NegativePage_Exception() { // arrange var book = new Book(); // act book.GoToPage(-1); }