2017-10-05 4 views
0

J'ai un test qui ne fonctionne pas et que je suis incapable de résoudre d'une façon ou d'une autre (je viens de Java donc je suis désolé d'avance s'il y a des erreurs dans ma terminologie) .Sinon vérifier si une autre méthode d'objet est invoquée avec la promesse

Il existe une classe d'objets Trigger qui a des fonctions publiques, foo() et bar(). La logique est:

On peut appeler foo() directement sur un autre objet, ou si bar() est appelé (avec un tableau ), puis Trigger.bar()Trigger.foo()array.length invoque fois. Trigger est implémenté avec bluebird Promises. Ceci est l'extrait de base de déclenchement (j'ai supprimé une certaine logique, avec cela, il semble un peu redondant, mais il se passe beaucoup plus en réalité):

// Will be refactored afterwards 
var self; 

var Trigger = function() { 
    self = this; 
}; 

Trigger.prototype.bar = function bar(members) { 
    return new Promise(function (resolve, reject) { 
    Promise.map(members, function (member) { 
    self.foo(member) 
    .then(function(res){ 
     ... 
    }) 
    // catch 
    }); 
    }); 
}; 

Trigger.prototype.foo = function foo(member) { 
    return new Promise(function(resolve, reject){ 
    doSomethingWithMember(member) 
    .then(function(res){ 
     ... 
    }) 
    // catch 
    }); 
} 

Donc, on peut voir que bar() appels foo() sur chaque membre dans le tableau de membres.

Je voulais écrire un test dans lequel j'espionne le Trigger Object et je vérifie s'il a invoqué foo() n fois.

donc ce que je en ai fait (avec des noms de fonction modifiés) où je suis en train de vérifier si elle est même appelée:

var chai = require('chai'); 
var expect = chai.expect; 
var sinon = require('sinon'); 
var sinonChai = require('sinon-chai'); 

chai.use(require('chai-as-promised')); 
chai.use(sinonChai); 

var Trigger = require(...); 
var trigger = new Trigger(); 

     ... 

    describe("bla", function() { 
    it("should invoke 'foo()' n times", function() { 
     var spy = sinon.spy(trigger.foo); 
     var member = MemberBuilder.buildCorrect(); 
     trigger.bar(member); 
     return expect(spy).to.have.been.called; // does not pass 
    }) 
    }); 

Cela ne fonctionne évidemment pas en raison des promesses de déclenchement, ce qui me dit:

AssertionError: expected foo to have been called at least once, but it was never called

Mais peu importe comment j'essaie de résoudre ce dans le puis() bloquer de bar(), il prétend toujours que mon espion n'a pas été appelé.

describe("bla", function() { 
    it("should invoke 'foo()' n times", function() { 
     var spy = sinon.spy(trigger.foo); 
     var member = MemberBuilder.buildCorrect(); 
     trigger.bar(member) 
     .then(function(){ 
      return expect(spy).to.have.been.called; // does not pass with the same AssertionError (has not been invoked) 
     }); 
    }) 

je l'ai fait une exploitation forestière et je suis sûr que foo() est invoquée. Des idées de ce que je fais mal?

Cordialement,

vegaaaa

Répondre

0

J'ai trouvé mon erreur (stupide!). Mal lire l'API ...

var spy = sinon.spy(trigger.foo);

devrait devenir

var spy = sinon.spy(trigger, "foo");

si cela fonctionne comme un charme:

describe("bla", function() { 
    it("should invoke 'foo()'", function() { 
    var spy = sinon.spy(trigger, "foo"); 
    var member = MemberBuilder.buildCorrect(); 
    trigger.bar(member) 
    .then(function(res) { 
     return expect(spy).to.have.been.called; 
    }) 
    }) 

Alternativement (parce que je l'ai trouvé plus compréhensible):

describe("bla", function() { 
    it("should invoke 'foo()'", function() { 
     sinon.spy(trigger, "foo"); 
     var member = MemberBuilder.buildCorrect(); 
     trigger.bar(member) 
     .then(function() { 
     return expect(trigger.foo).to.have.been.called; 
     }) 
    }) 

Espérons que cela aidera d'autres personnes rencontrant le même problème avec l'API.