Approval Tests are an alternative to writing expression assertions in your code.
As the following examples demonstrate, Approval Tests can result in significantly simpler and more elegant tests of complex objects.
Traditional tests spend equal time focusing on creating the inputs and verifying the outputs.
When the objects being tested are non-trivial, either the tests become quite verbose (as shown in this example), or it's tempting to only test a small part of the behaviour.
// Arrange, Act
Sandwich s = createSandwichForTest();
// Assert
REQUIRE("Sourdough" == s.getBread());
REQUIRE(s.getCondiments().contains("Mayo"));
REQUIRE(s.getCondiments().contains("Pepper"));
REQUIRE(s.getCondiments().contains("Olive Oil"));
REQUIRE(s.getFillings().contains("Tomato"));
REQUIRE(s.getFillings().contains("Lettuce"));
REQUIRE(s.getFillings().contains("Cheddar"));
Approval Tests simplify the verification of outputs. They do this by writing the outputs to a file, which once saved, becomes your spec.
You still supply the inputs, but Approval Tests gives you powerful ways of viewing complex outputs, meaning you can move on to the next feature or next test more quickly.
// Arrange, Act
Sandwich s = createSandwichForTest();
// Assert
ApprovalTests::Approvals::verify(s);
This generates the approval file - which is generated for you, but approved by you.
sandwich {
bread: "Sourdough",
condiments: ["Mayo", "Pepper", "Olive Oil"],
fillings: ["Tomato", "Lettuce", "Cheddar"]
}