El Blog de Ana Buigues » Jasmine http://anabuigues.com Wed, 07 Dec 2011 16:07:47 +0000 es-ES hourly 1 http://wordpress.org/?v=3.4 Code Kata – FizzBuzz http://anabuigues.com/2011/03/31/code-kata-fizzbuzz/ http://anabuigues.com/2011/03/31/code-kata-fizzbuzz/#comments Thu, 31 Mar 2011 16:41:59 +0000 Ana Buigues http://anabuigues.com/?p=3437 Siguiendo con la iniciativa de 12meses12katas paso a contaros el desafío de este mes, en si el problema es muy muy sencillo, la idea es la siguiente:  para el intervalo de números entre 1 y 100, si uno de ellos resulta múltiplo de 3 o contiene un 3, el resultado debe ser la palabra “Fizz”, si el número es múltiplo de 5 o contiene un 5, el resultado debe ser la palabra “Buzz”, si el número es múltiplo tanto de 3 como de 5, el resultado debe ser “FizzBuzz”. ¿Sencillo verdad?

Bueno, nos ponemos a ello, este mes he decidio realizarla en Javascript, ya que nunca he realizado TDD sobre Javascript y tenía mucha curiosidad. Así que lo primero fué investigar que frameworks hay disponibles y para mi asombro he visto que hay muchos! como por ejemplo QUnit, jqUnit, JsUnit, YUI Test, JSTestDriver, Jspec, Inspect, Jasmine etc… yo me he decantado por Jasmine, ya que es muy sencillito de utilizar, su sintaxis es muy clara y apenas requiere configuración. Además tiene una interfaz para mostrar el resultado de los test, la podeís ver al final del post.

Como siempre recomendaros que os paséis por github del proyecto para ver las distintas soluciones que están aportando a la iniciativa.

A continuación os dejo el código de la kata

function FizzBuzz() {
};
FizzBuzz.prototype.fizz = "Fizz";
FizzBuzz.prototype.buzz = "Buzz";
FizzBuzz.prototype.say = function(number) {
 var result = "";
 if (this.isMultipleOfThree(number) || this.containsTree(number))
 result += this.fizz;
 if (this.isMultipleOfFive(number) || this.containsFive(number))
 result += this.buzz;
 if (result.length == 0)
 result += number;
 return result;
};
FizzBuzz.prototype.isMultipleOfThree = function(number) {
 return number % 3 === 0;
};
FizzBuzz.prototype.isMultipleOfFive = function(number) {
 return number % 5 === 0;
};
FizzBuzz.prototype.containsTree = function(number) {
 return number.toString().indexOf('3') != -1;
};
FizzBuzz.prototype.containsFive = function(number) {
 return number.toString().indexOf('5') != -1;
};

Los tests realizados con Jasmine

describe("FizzBuzz", function() {
 var fizzBuzz;
 beforeEach(function() {
 fizzBuzz = new FizzBuzz();
 });
 it('should return number', function() {
 expect(fizzBuzz.say(2)).toEqual('2');
 expect(fizzBuzz.say(4)).toEqual('4');
 expect(fizzBuzz.say(7)).toEqual('7');
 expect(fizzBuzz.say(19)).toEqual('19');
 });
 it('should return Fizz', function() {
 expect(fizzBuzz.say(3)).toEqual('Fizz');
 expect(fizzBuzz.say(13)).toEqual('Fizz');
 expect(fizzBuzz.say(18)).toEqual('Fizz');
 expect(fizzBuzz.say(96)).toEqual('Fizz');
 });
 it('should return Buzz', function() {
 expect(fizzBuzz.say(5)).toEqual('Buzz');
 expect(fizzBuzz.say(20)).toEqual('Buzz');
 expect(fizzBuzz.say(95)).toEqual('Buzz');
 expect(fizzBuzz.say(100)).toEqual('Buzz');
 });
 it('should return FizzBuzz', function() {
 expect(fizzBuzz.say(15)).toEqual('FizzBuzz');
 expect(fizzBuzz.say(35)).toEqual('FizzBuzz');
 expect(fizzBuzz.say(54)).toEqual('FizzBuzz');
 expect(fizzBuzz.say(75)).toEqual('FizzBuzz');
 expect(fizzBuzz.say(90)).toEqual('FizzBuzz');
 });
});

Aquí os muestro la interfaz que nos ofrece Jasmine para ver el resultado del los test:

]]>
http://anabuigues.com/2011/03/31/code-kata-fizzbuzz/feed/ 7