This post is a summary of a lightningtalk I held for some of my colleagues at Objectware back in August 2008.
What is Arrange, Act, Assert (AAA)?
AAA is a way to organize your tests. The contents of the tests are divided in to three parts:
- Arrange: Do the necessary setup required for running the test. Usually multiple lines of code.
- Act: Execute the code which should be tested. Should be one line of code.
- Assert: Verify that the code behaved as expected. Should contain only one assertion.
Example of a test without AAA
[TestMethod] public void GetCustomerById() { // Arrange const int CustomerId = 5; var repository = new CustomerRepository(); // Act & Assert Assert.AreEqual(CustomerId, repository.GetCustomerById(CustomerId)); }The same test written in AAA style:
[TestMethod] public void GetCustomerById() { // Arrange const int CustomerId = 5; var repository = new CustomerRepository(); // Act Customer customer = repository.GetCustomerById(CustomerId); // Assert Assert.AreEqual(CustomerId, customer); }The example above is simple, but the value of using AAA style becomes more apparent for complex tests.
Why using AAA syntax
- The tests become more robust, easier to read and to maintain
- Being able to use AAA syntax is essential when writing Behaviour Driven Development style specifications/tests
AAA and mocking
In the following example, which parts of the code are arranging, acting and asserting?
The record/playback style should not be used, since it results in tests which are very hard to read and understand.The same test as above written in AAA style:
[TestMethod] public void ShouldGenerateCreditInvoiceDocumentWhenNegativeAmountNew() { // Arrange ICustomerService customerService = MockRepository.GenerateStub<ICustomerService>(); IDocumentService documentService = MockRepository.GenerateStub<IDocumentService>(); double amount = -1000; Customer customer = new Customer() { Id = 12345, Name = "Name1" }; customerService.Stub(stub => stub.GetCustomer(customer.Id)).Return(customer); InvoicingProcess invoicingProcess = new InvoicingProcess(customerService, documentService); // Act invoicingProcess.Invoice(customer.Id, amount); // Assert documentService.AssertWasCalled(stub => stub.CreateDocument(customer, DocumentType.CreditInvoice)); }
Mocking frameworks supporting AAA syntax
The following mocking frameworks supports AAA:
- Rhino Mocks 3.5
- Moq
- NUnit
- Typemock Isolator 5.0

0 kommentarer:
Legg inn en kommentar