2012-01-11 18 views
58

Recibí el mensaje de error anterior cuando realicé mi prueba. A continuación está mi código (estoy usando Backbone JS y Jasmine para probar). ¿Alguien sabe por qué pasa esto?Sinon JS "Intento envolver ajax que ya está envuelto"

$(function() { 
    describe("Category", function() { 
    beforeEach(function() { 
     category = new Category; 
     sinon.spy(jQuery, "ajax"); 
    } 

    it("should fetch notes", function() { 
     category.set({code: 123}); 
     category.fetchNotes(); 
     expect(category.trigger).toHaveBeenCalled(); 
    } 
    }) 
} 

Respuesta

88

Tienes que quitar el espía después de cada prueba. Echar un vistazo al ejemplo de los documentos Sinon:

{ 
    setUp: function() { 
     sinon.spy(jQuery, "ajax"); 
    }, 

    tearDown: function() { 
     jQuery.ajax.restore(); // Unwraps the spy 
    }, 

    "test should inspect jQuery.getJSON's usage of jQuery.ajax": function() { 
     jQuery.getJSON("/some/resource"); 

     assert(jQuery.ajax.calledOnce); 
     assertEquals("/some/resource", jQuery.ajax.getCall(0).args[0].url); 
     assertEquals("json", jQuery.ajax.getCall(0).args[0].dataType); 
    } 
} 

Así que en su prueba de jazmín debería tener este aspecto:

$(function() { 
    describe("Category", function() { 
    beforeEach(function() { 
     category = new Category; 
     sinon.spy(jQuery, "ajax"); 
    } 

    afterEach(function() { 
     jQuery.ajax.restore(); 
    }); 

    it("should fetch notes", function() { 
     category.set({code: 123}); 
     category.fetchNotes(); 
     expect(category.trigger).toHaveBeenCalled(); 
    } 
    }) 
} 
+0

En una de mis pruebas, tuve un bloque AfterEach también pero no resolvió el problema. ¿Podría ser porque puse AfterEeach después de todas las pruebas en lugar de justo antes de Each? –

+0

Creo que sí, porque 'beforeEach' y' afterEach' son llamadas de función al igual que tus pruebas. Entonces, llamar a 'afterEach' después de todas tus pruebas no tendrá efecto. –

+0

process.exit.restore(); ... nice – danday74

6

Lo que se necesita en el principio es:

before -> 
    sandbox = sinon.sandbox.create() 

    afterEach -> 
    sandbox.restore() 

Luego llame a algo así como:

windowSpy = sandbox.spy windowService, 'scroll' 
  • Tenga en cuenta que utilizo coffee script.
+5

A menos que sea abierto o no especificado, las respuestas deben estar en el idioma en el que está la pregunta. –

+0

@JustinJohnson No creo que haya ningún malentendido entre JS y Coffee Script. Por cierto, son el MISMO idioma. – Winters

+4

Su experiencia y la del interrogador no son las mismas, y no debe suponer que lo son. CoffeeScript agrega azúcar sintáctico a JavaScript (que usaste aquí), por lo que * no * son lo mismo. –

Cuestiones relacionadas