Life-Cycle Methods
Global Callbacks
Global callbacks affect the execution of the entire test bundle CFC and all of its suites and specs.
beforeAll()
Executes once before all specs for the entire test bundle CFC. A great place to initialize the environment the bundle needs for testing.
afterAll()
Executes once after all specs for the entire test bundle CFC. A great place to teardown the environment the bundle needed for testing.
Copy
run( testResults, testBox )
Executes once so it can capture all your describe
and it
blocks so they can be executed by a TestBox runner.
You can find the API docs for testbox
and the testResults
arguments here: https://s3.amazonaws.com/apidocs.ortussolutions.com/testbox/current/
Suite CallBacks
The following callbacks influence the execution of specification methods: it(), then()
. The great flexibility of the BDD approach is that it allows you to nest describe
, feature
, story
, given
, scenario
, when
suite blocks to create very human readable and organized documentation for your tests. Each suite block can have its own life-cycle methods as well. Not only that, if they are nested, TestBox will walk the tree and call each beforeEach()
and afterEach()
in the order you declare them.
TestBox will walk down the tree (from the outermost suite) for beforeEach()
operations and out of the tree (from the innermost suite) for afterEach()
operations.
beforeEach( body, data )
Executes before every single spec in a single suite block and receives the currently executing spec and any data you want to bind the specification with. The body
is a closure/lambda that will fire and the data
argument is a way to bind the life-cycle method with a struct of data that can flow down to specs.
The body
closure will receive have the following signature:
afterEach( body, data )
Executes after every single spec in a single suite block and receives the currently executing spec and any data you want to bind the specification with. The body
is a closure/lambda that will fire and the data
argument is a way to bind the life-cycle method with a struct of data that can flow down to specs.
The body
closure will receive have the following signature:
Here are some examples:
aroundEach( body, data )
Executes around the executing spec so you can provide code that will surround the execution of the spec. It's like combining before
and after
in a single operation. The body
is a closure/lambda that will fire and the data
argument is a way to bind the life-cycle method with a struct of data that can flow down to specs. This is the only way you can use CFML constructs that wrap around code like: try/catch, transaction, for, while, etc.
The body
closure will receive have the following signature:
The spec
is the currently executing specification, the suite
is the suite this life-cycle is embedded in and data
is the data binding, if any.
Here is an example:
Lifecycle Nesting Order
When you use beforeEach()
, afterEach()
, and aroundEach()
at the same time, there is a specific order they fire in. For a given describe block, they will fire in this order. Remember, aroundEach()
is split into two parts-- the half of the method before you call spec.body()
and the second half of the method.
beforeEach
aroundEach (first half)
it() (the
spec.body()
call)aroundEach (second half)
afterEach()
Here's an example:
If there are more than one it()
blocks, the process repeats for each one. Steps 1, 2, 4, 5 will wrap every single it()
.
When you nest more than one describe block inside the other, the before/around/after order is the same but drills down to the innermost describe and then bubbles back up. That means the outermost beforeEach()
starts and we end on the outermost afterEach()
.
Here's what an example flow would look like that had before/after/around specified in two levels of describes with a single it()
in the inner most describe.
Outermost
beforeEach()
callInnermost
beforeEach()
callOutermost
aroundEach()
call (first half)Innermost
aroundEach()
call (first half)The
it()
blockInnermost
aroundEach()
calls (second half)Outermost
aroundEach()
call (second half)Innermost
afterEach()
callOutermost
afterEach()
call
This works regardless of the number of levels and can obviously have many permutations, but the basic order is still the same. Before/around/after and starting at the outside working in, and back out again. This process happens for every single spec or it()
block. This is as opposed to the beforeAll()
and afterAll()
method which only run once for the entire CFC regardless of how many specs there are.
Last updated