2016-05-06 8 views
0

Ich versuche Unit-Test ein Mungo-Objekt, das Versprechen verwendet. Ich habe den Test unten geschrieben und es funktioniert, aber es ist nicht vollständig. Ich kann nicht herausfinden, wie man testet, ob die "then" - oder "catch" -Methoden aufgerufen werden.Unit Test Mungo verspricht mit Sinon

Wie kann ich einen Spion verwenden, um zu überprüfen, ob die "then" -Methode aufgerufen wird, wenn ich das Versprechen auflöse?

Methode

export function create(req, res) { 
    User 
    .createAsync(req.body) 
    .then(handleCreate(res, req.originalUrl)) 
    .catch(handleError(res)); 
} 

Unit-Test

it('should do something',() => { 
    const req = { 
    body: 45, 
    }; 

    const res = {}; 

    const mockRole = sandbox.mock(Role).expects('createAsync').once().withArgs(45) 
    .returns(Promise.resolve()); 

    controller.create(req, res); 
}); 

UPDATE mit der Lösung zu testen I USED (6. Mai 2016)

Dank in der richtigen Richtung @ReedD mir geholfen

Obwohl dies "funktioniert", ich f Aal, als würde ich die Funktionalität von Versprechen mehr testen als meinen Code.

it('should call create with args and resolve the promise',() => { 
    const createSpy = sinon.spy(); 
    const errorSpy = sinon.spy(); 

    sandbox.stub(responses, 'responseForCreate').returns(createSpy); 
    sandbox.stub(responses, 'handleError').returns(errorSpy); 

    sandbox.mock(Role).expects('createAsync').once().withArgs(45) 
    .returns(Promise.resolve()); 

    return controller.create(req, res).then(() => { 
    expect(createSpy.calledOnce).to.be.equal(true); 
    expect(errorSpy.calledOnce).to.be.equal(false); 
    }); 
}); 

Antwort

1

Sie könnten handleCreate und handleError-module.exports hinzufügen und dann Stubs oder spys derer machen. Im Folgenden finden Sie ein Beispiel für das, was Sie meiner Meinung nach versuchen möchten. Ich nahm auch an, dass du Sinon/Chai benutzt.

http://ricostacruz.com/cheatsheets/sinon-chai.html

// controller.js 

module.exports = { 
    handleCreate: function() { 
     // ..code 
    }, 
    handleError: function() { 
     // ..code 
    }, 
    create: function (req, res) { 
     User 
      .createAsync(req.body) 
      .then(this.handleCreate(res, req.originalUrl)) 
      .catch(this.handleError(res)); 
    } 
}; 



// test/test.js 

var controller = require('../controller'); 

it('should do something', function (done) { 

    var handleCreate = sandbox.spy(controller, 'handleCreate'); 
    var handleError = sandbox.spy(controller, 'handleError'); 
    var mockRole  = sandbox 
     .mock(Role) 
     .expects('createAsync') 
     .once().withArgs(45) 
     .returns(Promise.resolve()); 


    var req = { 
     body: 45, 
    }; 

    var res = { 
     send: function() { 
      expect(handleCreate).to.be.calledOnce; 
      expect(handleError).to.not.be.called; 
      done(); 
     } 
    }; 

    controller.create(req, res); 
}); 
+0

Dank. Das hat mich auf die richtige Spur für die Lösung gebracht, die ich am Ende benutzt habe. Am Ende habe ich das Gefühl, dass ich nur die Funktionalität von Promises testen werde: D – VtoCorleone

+0

Richtig, dieser Komponententest stellt nur sicher, dass deine create-Funktion richtig funktioniert. Sie sollten mehr Komponententests schreiben, um unabhängig voneinander sicherzustellen, dass 'handleCreate' und' handleError' auch korrekt funktionieren. – ReedD