2012-09-22 20 views
8

Tengo un archivo app.coffee:Mocha, should.js y haciendo valer una excepción

class TaskList 

class Task 
    constructor: (@name) -> 
     @status = 'incomplete' 
    complete: -> 
     if @parent? and @parent.status isnt 'completed' 
      throw "Dependent task '#{@parent.name}' is not completed." 
     @status = 'complete' 
     true 
    dependsOn: (@parent) -> 
     @parent.child = @ 
     @status = 'dependent' 

# Prepare scope stuff 
root = exports ? window 
root.TaskList = TaskList 
root.Task = Task 

y un archivo llamado test/taskTest.coffee:

{TaskList, Task} = require '../app' 
should = require 'should' 

describe 'Task Instance', -> 
    task1 = task2 = null 
    it 'should have a name', -> 
     something = 'asdf' 
     something.should.equal 'asdf' 
     task1 = new Task 'feed the cat' 
     task1.name.should.equal 'feed the cat' 
    it 'should be initially incomplete', -> 
     task1.status.should.equal 'incomplete' 
    it 'should be able to be completed', -> 
     task1.complete().should.be.true 
     task1.status.should.equal 'complete' 
    it 'should be able to be dependent on another task', -> 
     task1 = new Task 'wash dishes' 
     task2 = new Task 'dry dishes' 
     task2.dependsOn task1 
     task2.status.should.equal 'dependent' 
     task2.parent.should.equal task1 
     task1.child.should.equal task2 
    it 'should refuse completion it is dependent on an uncompleted task', -> 
     (-> task2.complete()).should.throw "Dependent task 'wash dishes' is not completed." 

Si ejecuta este comando en el terminal: mocha -r should --compilers coffee:coffee-script -R spec que tienen una prueba de falla (la última) diciendo que esperaba una excepción "La tarea dependiente no lava los platos". pero fue 'indefinido'.

Si cambio (-> task2.complete()).should.throw a -> task2.complete().should.throw quitando el paréntesis, se supera la prueba, y falla si no arrojo la excepción. Pero si cambio el mensaje de excepción a algo aleatorio, todavía pasa. ¿Estoy haciendo algo mal? ¿No debería pasar la prueba solo si el mensaje es literalmente "Tarea dependiente" no se completa el lavado de platos? "?

+0

¿Estás seguro de que 'lavar los platos' es '' 'parent.name'''? Volvería a declarar propiedades en cada paso de prueba. podrías usar beforeEach en tu prueba. – vik

+0

@vik Sí, es 'parent.name'. Intenté volver a definir cada propiedad en beforeEach() y todavía tengo el mismo problema. La afirmación final obtiene 'undefined'. – Matthew

Respuesta

4

Está arrojando una excepción con una cadena en lugar de arrojar un objeto de error. throw() busca esto último. Por lo que su código original funciona si lo hace:

throw new Error "Dependent task '#{@parent.name}' is not completed." 

Si algo se escribe en CoffeeScript está produciendo resultados que no tienen sentido, tratar de compilar a js (o pegar el código en try CoffeeScript Vas a ver. que:

-> task2.complete().should.throw "Dependent task 'wash dishes' is not completed." 

compila a:

(function() { 
    return task2.complete().should["throw"]("Dependent task 'wash dishes' is not completed."); 
}); 

que acaba define una función y no lo ejecuta Esto explica por qué cambiar la cadena no hace diferencia. Espero que eso ayude.

+0

mi opinión: agregue corchetes para ajustar el cuerpo de la función, haría que la muestra del coffeescript sea más clara: (-> task2.complete()). Should.throw "Tareas de lavado dependientes" no se completó ". –

3

En primer lugar, ese es un buen aspecto de Coffeescript.

En segundo lugar, David Weldon tiene razón en su respuesta que simplemente puede cambiar el tiro para lanzar un error y funciona.

Aquí está su código puesto en un archivo largo con solo el lanzamiento cambiado.

class TaskList 

class Task 
    constructor: (@name) -> 
     @status = 'incomplete' 
    complete: -> 
     if @parent? and @parent.status isnt 'completed' 
      throw new Error "Dependent task '#{@parent.name}' is not completed." 
     @status = 'complete' 
     true 
    dependsOn: (@parent) -> 
     @parent.child = @ 
     @status = 'dependent' 

# Prepare scope stuff 
root = exports ? window 
root.TaskList = TaskList 
root.Task = Task 

should = require 'should' 

describe 'Task Instance', -> 
    task1 = task2 = null 
    it 'should have a name', -> 
     something = 'asdf' 
     something.should.equal 'asdf' 
     task1 = new Task 'feed the cat' 
     task1.name.should.equal 'feed the cat' 
    it 'should be initially incomplete', -> 
     task1.status.should.equal 'incomplete' 
    it 'should be able to be completed', -> 
     task1.complete().should.be.true 
     task1.status.should.equal 'complete' 
    it 'should be able to be dependent on another task', -> 
     task1 = new Task 'wash dishes' 
     task2 = new Task 'dry dishes' 
     task2.dependsOn task1 
     task2.status.should.equal 'dependent' 
     task2.parent.should.equal task1 
     task1.child.should.equal task2 
    it 'should refuse completion it is dependent on an uncompleted task', -> 
     (-> task2.complete()).should.throw "Dependent task 'wash dishes' is not completed." 

Mocha ese bastardo y listo.

Cuestiones relacionadas