TDD Walkthrough

This page walks you through a simple TDD kata

git clone the code from git clone https://livingwater@bitbucket.org/living-water-js/tdd-walkthrough.git

 

Pre-requisite knowledge

  • How to install a the unit testing framework for the particular language

  • An understanding of why testing is important

  • How to write a unit test and run the test

  • The three A's (Arrange, Act, Assert)

  • Writing incremental tests and why this is important - one test, some production code, then next test and some production code

The problem statement

A user can send from a front end application a series of comma separated words to be logged as part of a wider application. You can assume that there already exists some code that sends a cleansed array of words to the business/database tier - these are referred to as tags. You must design an implementation class (the CUT) that splits that string into an array of strings. You will need to write the tests first, then the production code.

Overview

You are going to develop a small piece of code that accepts a comma delimited list of tags (words/tokens - characters, numbers, some symbols like $£%& but not a comma) and must return an array of tags. The preceding and proceeding commas should be removed, white spaces preceding the first tag must be removed, white spaces proceeding the last tag must be removed, contiguous series of words separated with spaces and ended with a comma should be treated as single tag

Examples of the rules are as follows

  • "" must return []

  • "java" must return ["java"]

  • " java,python" must return ["java", “python”]

  • "java byte code,python" must return must return ["java byte code", "python"]

Constructs your tests in the following order

Iteration 1

Test 1

var assert = require("chai").assert; var expect = require("chai").expect; // Put your CUT here describe('Splitting a string', function() { it('Input an empty string, return an empty array []', function() { // arrange... var cut = new StringSplitter(); var expectedResult = [] var emptyString = ""; // act... var actualResult = cut.splitString( emptyString ); console.log( actualResult.length); // assert... assert.equal(actualResult.length, expectedResult.length ); expect(actualResult).to.eql(expectedResult); }); });

CUT 1

class StringSplitter { splitString( stringToSplit ) { var result = []; if( stringToSplit.length < 1 ) return result; return result; } }

 

Iteration 2

Test 2

var assert = require("chai").assert; var expect = require("chai").expect; // put your CUT here describe('Splitting a string', function() { it('Input an empty string, return an empty array []', function() { // arrange... var cut = new StringSplitter(); var expectedResult = [] var emptyString = ""; // act... var actualResult = cut.splitString( emptyString ); console.log( actualResult.length); // assert... assert.equal(actualResult.length, expectedResult.length ); expect(actualResult).to.eql(expectedResult); }); it('Input one string, return array with one item', function() { // arrange... var cut = new StringSplitter(); var expectedResult = ["java"] var emptyString = "java"; // act... var actualResult = cut.splitString( emptyString ); console.log( actualResult.length); // assert... assert.equal(actualResult.length, expectedResult.length ); expect(actualResult).to.eql(expectedResult); }); });

CUT 2

Phase 3

Test 3

CUT 3