Skip to content

Instantly share code, notes, and snippets.

@bitifet
Last active November 12, 2015 05:53
Show Gist options
  • Select an option

  • Save bitifet/2293f97cba5b2a784aa1 to your computer and use it in GitHub Desktop.

Select an option

Save bitifet/2293f97cba5b2a784aa1 to your computer and use it in GitHub Desktop.
Jasmine templates
// checkEquals (fn, tests) - Helper function to build equality tests with Jasmine.
function checkEquals(fn, tests){
if (fn instanceof Array) { // Allow to specify as ["this", fn] if required.
var target = fn[0]; // this
fn = fn[1];
} else { // fn expected to be a single functin by default.
var target = this; // Or any other arbitrary value.
};
return function(){
tests.map(function(t){
// Each tests in form: [[argumentsArray], expectedResult].
var args = (t[0] instanceof Array)
? t[0]
: [t[0]] // Single argument can be passed directly if non Array.
;
var expected = t[1];
var actual = fn.apply(target,args);
expect(actual).toEqual(expected);
});
};
};
/*/ Example:
describe('FizzBuzz', function() {
it ('Known results check', checkEquals(fizzbuzz, [
[1, "1"],
[2, "2"],
[3, "fizz"],
[4, "4"],
[5, "buzz"],
[6, "fizz"],
[7, "7"],
[8, "8"],
[9, "fizz"],
[10, "buzz"],
[11, "11"],
[12, "fizz"],
[13, "13"],
[14, "14"],
[15, "fizzbuzz"],
]));
});
function fizzbuzz(number){
var r = "";
(number % 3) || (r+="fizz");
(number % 5) || (r+="buzz");
r || (r = String(number));
return r;
};
//*/
@jllado
Copy link
Copy Markdown

jllado commented Nov 11, 2015

Creo que te equivocas con esta aproximación por varios motivos:

  • El test para mi gusto testea demasiados comportamientos. Con un problema "simple" como es el del FizzBuzz, sales adelante con este tipo de test pero para una funcionalidad más compleja, podría llevarte demasiado tiempo poner el test en verde. Con lo cual, no estás permitiendo que los test guien tu desarrollo...
  • El test no revela su intención. Tengo que "mirarme en detalle" qué reglas/funcionalidades son las que se tienen que cumplir.

@bitifet
Copy link
Copy Markdown
Author

bitifet commented Nov 12, 2015

Creo que no me has entendido, @jllado, o no vamos por el mismo sitio...

La función que publico no es un test, sino una herramienta para simplificarlos (o simplificar la especificación sobre la que se hace el test, que es decir lo mismo, pero me gusta más ;-)). Eso creo que lo has entendido, pero por si acaso lo puntualizo.

  • Si el test tiene demasiados comportamientos para tu gusto, quítaselos. No pretendia decir que tengas que comprobar TODOS los casos posibles sino todo lo contrario: Precisamente con una funcionalidad mas compleja, aunque efectivamente te llevaria demasiado tiempo comprobar todos los casos, probablemente sí te interesará verificar mas casos. Típicamente los (o algunos de los) mas significativos (p. ej. unos cuantos "fizz", unos cuantos "buzz", unos cuantos "fizzbuzz" y unos cuantos numéricos, alguno de alrededor de los anteriores).
  • No entiendo que quieres decir con que "el test no revela su intención". Si te fijas, es exactamente el mismo que hiciste tu, sólo que comprobando mas ítems del mismo caso y con menos verborrea. Pero el resultado es el mismo. Ejemplo (cambiando un ítem de la especificación para forzar un fallo):
    PhantomJS 1.9.8 (Linux 0.0.0) FizzBuzz Known results check FAILED
            Expected 'buzz' to equal 'buzzy_err'.
                at /home/joanmi/prj/test/tdd/karma/test.js:19
    PhantomJS 1.9.8 (Linux 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.041 secs / 0.001 secs)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment