Scala Problem: You’d like to have better output from your ScalaTest assert
tests, output that shows the expected and actual values.
Solution
One approach is to use the ===
method instead of ==
. When an assert test fails, the ===
method output shows the two values from the test.
This can be demonstrated by putting an intentional error into a unit test while using ===
. Here’s a modified version of a TDD test method with an intentional error:
test("new pizza has zero toppings (version 2)") { // intentional error here; size should be 0 assert(pizza.getToppings.size === 1) }
Adding this test to the TDD test class introduced in Writing TDD Tests with ScalaTest results in the following output:
[info] PizzaTests: [info] - new pizza has zero toppings (version 2) *** FAILED *** [info] 0 did not equal 1 (PizzaTests.scala:18)
Using ===
informs you that “0 did not equal 1,” and gives you the line number of the failure.
Another approach is to use expectResult
instead of assert
:
test("new pizza has zero toppings (version 3)") { // `expectResult` is now `assertResult` // expectResult(1) { assertResult(1) { pizza.getToppings.size } }
Although it’s a little more verbose, it gives more meaningful output, indicating what value was expected and what was actually found:
[info] PizzaTests: [info] - new pizza has zero toppings (version 3) *** FAILED *** [info] Expected 1, but got 0 (PizzaTests.scala:19)
Both approaches are simple, and extremely helpful when debugging why a test failed. Use whichever you prefer, or both.
See Also
- Writing TDD Tests with ScalaTest
- ScalaTest’s “Using Assertions” documentation: http://www.scalatest.org/user_guide/using_assertions
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |