I personally like to have atomic tests, that are designed, generally, to test only one or two things, with most verification being called explicitly called in the test case itself. That way you can easily see at the top level what is being verified, for example (from parkcalc).
[TestMethod]
public void InvalidTextAsExitDate()
{
Parking.Calculate(ParkingType.LongTermSurfaceParking, "12:00", "AM", "today", "12:00", "AM", "INVALID");
Verify.SpecificErrorIsShown(ErrorMessages.EnterCorrectDate);
}
[TestMethod]
public void OnlySpecifyEntryDate()
{
Parking.Calculate(ParkingType.LongTermSurfaceParking, "12:00", "AM", "today", "12:00", "AM", "");
Verify.VerifyResult(ParkingType.LongTermSurfaceParking, "12:00", "AM", "today", "12:00", "AM", "");
}
Whenever I have pushed verification down to the lower levels, I always keep wondering, "What is this really verifying.", e.g.
[TestMethod]
public void OnlySpecifyExitDate()
{
Parking.CalculateAndVerify(ParkingType.LongTermSurfaceParking, "12:00", "AM", "", "12:00", "AM", "today");
}
then the next level down is
public static void CalculateAndVerify(ParkingType parkingType, string inTime, string inAMPM, string inDate, string outTime, string outAMPM, string outDate)
{
Calculate(parkingType, inTime, inAMPM, inDate, outTime, outAMPM, outDate);
Verification.Verify.VerifyResult(parkingType, inTime, inAMPM, inDate, outTime, outAMPM, outDate);
}
Full working example solution of my framework is available at https://github.com/teknologika/stax