As we have seen before, the describe()
function describes a test suite of related specs in a test bundle CFC. The title of the suite is concatenated with the title of a spec to create a full spec's name which is very descriptive. If you name them well, they will read out as full sentences as defined by BDD style.
describe("A spec", function() {it("is just a closure, so it can contain any code", function() {coldbox = 0;coldbox++;​expect( coldbox ).toBe( 1 );});​it("can have more than one expectation", function() {coldbox = 0;coldbox++;​expect( coldbox ).toBe( 1 );expect( coldbox ).toBeTrue();});});
Calls to our describe()
function can be nested with specs at any level or point of execution. This allows you to create your tests as a related tree of nested functions. Please note that before a spec is executed, TestBox walks down the tree executing each beforeEach()
and afterEach()
function in the declared order. This is a great way to logically group specs in any level as you see fit.
describe("A spec", function() {​beforeEach(function( currentSpec ) {coldbox = 22;application.wirebox = new coldbox.system.ioc.Injector();});​afterEach(function( currentSpec ) {coldbox = 0;structDelete( application, "wirebox" );});​it("is just a function, so it can contain any code", function() {expect( coldbox ).toBe( 22 );});​it("can have more than one expectation and talk to scopes", function() {expect( coldbox ).toBe( 22 );expect( application.wirebox.getInstance( 'MyService' ) ).toBeComponent();});​describe("nested inside a second describe", function() {​beforeEach(function( currentSpec ) {awesome = 22;});​afterEach(function( currentSpec ) {awesome = 22 + 8;});​it("can reference both scopes as needed ", function() {expect( coldbox ).toBe( awesome );});});​it("can be declared after nested suites and have access to nested variables", function() {expect( awesome ).toBe( 30 );});​});