Arrange, Act and Assert syntax for testing

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:

  1. Arrange: Do the necessary setup required for running the test. Usually multiple lines of code.
  2. Act: Execute the code which should be tested. Should be one line of code.
  3. 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

AAA and mocking

In the following example, which parts of the code are arranging, acting and asserting?

ScreenShot002

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:

Etiketter: