Coding Practice: How should I layout my unit tests?
Just as you would when working with any code, your objective is readability and ease of comprehension. A coding layout for unit tests that achieves this objective is the Arrange, Act, Assert pattern: Arrange all necessary preconditions and inputs, Act on the object or method under test, and Assert that the expected results have occurred.
Quote:
“If you have too much code in any of these sections, you’re probably breaking good unit test best practices by: having too much setup, testing too many concerns, or having too many assertions.”
– Jag Reehal
Application:
When you use tools like mocking, your unit test setup becomes more involved (see below). The power of Arrange, Act, Assert is that it will make sure that the behavior you are validating is clear. This is important because the quickest way for someone to familiarize themselves with your code is to review your unit tests, and the easier they are to understand the faster someone can ramp up on your code base.
[TestMethod] public void Will_Write_To_Log_If_Customer_Fails_Validation_When_Adding_Customer() { // Arrange var customerValidator = new Mock(); customerValidator.Setup(c => c.IsValid(It.IsAny())) .Throws(new ArgumentException(CustomerValidator.NAME_ERROR_MESSAGE)); var logger = new Mock(); var customerService = new CustomerService(customerValidator.Object, logger.Object); // Act customerService.AddCustomer(new Customer()); // Assert logger.Verify(c => c.LogError(CustomerValidator.NAME_ERROR_MESSAGE)); }
References:
http://www.arrangeactassert.com/why-and-what-is-arrange-act-assert/