TestBox & MockBox

Behavior Driven Development and Mocking Goodness!

TestBox is a next generation testing framework for ColdFusion (CFML) that is based on BDD (Behavior Driven Development) for providing a clean obvious syntax for writing tests. It contains not only a testing framework, runner, assertions and expectations library but also ships with MockBox, A Mocking & Stubbing Framework. It also supports xUnit style of testing and MXUnit compatibilities.


You can get started quickly with TestBox and MockBox in any ColdFusion (CFML) application by leveraging CommandBox, our CLI and package manager. Just following the simple commands below to install the latest stable or bleeding edge version of TestBox.

		    // Install latest stable version
		    box install testbox
		    // Install bleeding edge version
		    box install testbox@be
You can also visit https://cfdocs.org/testbox for a quick reference guide.

Become a sponsor to help the development of this product.


TestBox supports a readable Behavior Driven Development syntax and the more traditional xUnit style syntax as well.


If you are not so familiar with BDD, please download our BDD RefCard to give you a quick head start.

Download BDD Refcard
describe("A spec", function() {
	beforeEach(function() {
		testbox = 22;
		application.wirebox = new wirebox.system.ioc.Injector();
	afterEach(function() {
		testbox = 0;
		structDelete( application, "wirebox" );

	// Using gherkins style declarations
	scenario( "Get box volume", function(){
		given( "I have entered a width of 20
		    And a height of 30
		    And a depth of 40", function(){
		    when( "I run the calculation", function(){
		          then( "the result should be 24000", function(){
		              // call the method with the arguments and test the outcome
		              expect( myObject.myFunction(20,30,40) ).toBe( 24000 );

    it("can have more than one expectation and talk to scopes", function() {
          expect( testbox ).toBe( 22 );
          expect( application.wirebox.getInstance( 'MyService' ) ).toBeComponent();

    describe("nested inside a second describe", function() {
          beforeEach(function() {
               awesome = 22;
          afterEach(function() {
               awesome = 22 + 8;
          it("can reference both scopes as needed ", function() {
            expect( testbox ).toBe( awesome );

     it("can be declared after nested suites and have access to nested variables", function() {
          expect( awesome ).toBe( 30 );

If you are not so familiar with TDD and xUnit, please download our TDD RefCard to give you a quick head start.

Download TDD Refcard
component displayName="TestBox xUnit suite" labels="railo,cf"{

/*********************************** LIFE CYCLE Methods ***********************************/

     function beforeTests(){
          application.salvador = 1;

     function afterTests(){
          structClear( application );

     function setup(){
          request.foo = 1;

     function teardown(){
          structClear( request );

/*********************************** Test Methods ***********************************/

     function testIncludes(){
          $assert.includes( "hello", "HE" );
          $assert.includes( [ "Monday", "Tuesday" ] , "monday" );

     function testNotIncludes(){
          $assert.notIncludes( "hello", "what" );
          $assert.notIncludes( [ "Monday", "Tuesday" ] , "Friday" );

     function testIsNotEmpty(){
          $assert.isNotEmpty( [1,2] );
          $assert.isNotEmpty( {name="luis"} );
          $assert.isNotEmpty( "HelloLuis" );
          $assert.isNotEmpty( querySim( "id, name
               1 | luis") );

     function testSkipped() skip{
          $assert.fail( "This Test should fail" );

     boolean function isRailo(){
          return structKeyExists( server, "railo" );

     function testSkippedWithConstraint() skip="isRailo"{
          $assert.fail( "This Test should fail" );

     function testAssertShortcut() {
          assert( application.salvador == 1 );

     function testisTrue() {
          $assert.isTrue( 1 );

/*********************************** NON-RUNNABLE Methods ***********************************/     

     function nonStandardNamesWillNotRun() {
          fail( "Non-test methods should not run" );

     private function privateMethodsDontRun() {
          fail( "Private method don't run" );


Here are some of the major features of TestBox and MockBox

  • BDD style testing
  • xUnit style testing
  • Testing life-cycle methods
  • MockBox integration for mocking and stubbing
  • Ability to extend and create custom test runners
  • Ability to extend and create custom test reporters
  • Extensible reporters, bundled with tons of them:
    • JSON
    • XML
    • JUnit 4 XML
    • Text (80's style)
    • Console
    • TAP (Test Anything Protocol)
    • Simple HTML
    • Min - Minimalistic Heaven
    • Raw
    • CommandBox
  • Asynchronous testing
  • Multi-suite capabilities
  • Test skipping
  • Suite skipping
  • Dynamic skipping support via runtime executions
  • Test one or more suites exclusively
  • Test one or more tests/specs exclusively
  • Test labels and tagging
  • Testing debug output stream
  • Clickable suite titles to filter test execution
  • Much more!


If you get stuck or need to get up to speed with testing, mocking, continuous integration or anything BDD, we would love to help. You can get professional support or training directly from the TestBox Team anywhere in the world.

Course Duration Datasheet
CBOX-205 : BDD & TDD CFML Development

CBOX-205 is one of our core courses that focus on testing principles, TDD (Test Driven Development), BDD (Behavior Driven Development), mocking and automation. In this 1 or 2 day course you will be exposed to testing theory, types of tests, working with TestBox, application testing, automation, tools of the trade and finally learn about Mocking and Stub objects. You will have both theory and hands on workshops that will sharpen your skills and challenge you.

1-2 days Download

Ready to get started?

Please contact us at consulting@ortussolutions.com for further information or click the button below to send us a quick message.

Contact Us