2016-04-07 8 views
0

Ich bin wirklich neu zu Mocha/Chai/Sinon und Tests im Allgemeinen. Ich habe es geschafft, einen einfachen Express-Server erfolgreich zu testen, eine Funktion, die Versprechen verspricht, und ein grundlegendes Setup, um meine Nase nass zu machen. aber ich stecke auf Spies/Stubs/Mocks.Wie kann ich eine verschachtelte Abhängigkeit in mit Sinon

Meine Faust Schluckauf versucht, diese glob zu prüfen hat in einem externen Modul aufgerufen wurde:

//in utils.js 
var glob = require('glob'); 

module.exports = { 
    funToTest: function (msg, callback) { 
    console.log(msg); 
    glob('*md', { 
     cwd: 'files/' 
    }, function (err, files) { 
     console.log(files); 
    }); 
    callback(); 
    callback(); 
    } 
}; 

Mit einem Mokka/chai/sinon/Sinon-chai Kombination:

// in utils-test.js 
var utils = require('utils.js'); 
var glob = require('glob'); 

describe('Utils', function() { 
    describe('funToTest method', function() { 
    const callback = sinon.spy(); 
    const globSpy = sinon.spy(glob); 

    before(function (done) { 
     utils.funToTest('Files:', callback); 
     done(); 
    }); 

    // This PASSES fine 
    it ('should call our callback twice', function() { 
     expect(callback).to.have.been.calledTwice; 
    }); 

    // This NOT SO MUCH 
    it('should call glob once', function() { 
     expect(globSpy).to.have.been.calledOnce; 
    }); 
)}; 
)}; 

Die oben scheitert mit einem Assertionsfehler:

AssertionError: expected glob to have been called exactly once, but it was called 0 times 

Also wie spioniere ich auf die Glob-Abhängigkeit in utils.funToT aus est um zu sehen, ob man angerufen wird?

Dank wie immer für alle Hinweise ...

+0

Haben Sie versucht "erwarten (globspy.calledOnce) .to.be.true"? –

Antwort

0

Sie auf dem glob Modul Spionage selbst, nicht der glob Anruf innerhalb der funToTest Methode. Das Problem besteht darin, dass es sich bei dem Glob-Aufruf um ein Implementierungsdetail handelt, auf das in Ihrem Test nicht zugegriffen werden kann. Sie müssten ein Argument für den Glob Callback übergeben und testen, dass es mit einem Spion oder Stub aufgerufen wurde.

//in utils.js 
var glob = require('glob'); 

module.exports = { 
    funToTest: function (msg, globCb, callback) { 
    glob('*md', { 
     cwd: 'files/' 
    }, globCb); 
    callback(); 
    callback(); 
    } 
}; 

// in utils-test.js 
var utils = require('utils.js'); 
var glob = require('glob'); 

describe('Utils', function() { 
    describe('funToTest method', function() { 
    const callback = sinon.spy(); 
    const globCb = sinon.spy(); 

    const err = {err: 'Error'}; 
    const files = ['file1', 'file2']; 

    before(function (done) { 
     utils.funToTest('Files:', globCb, callback); 
     done(); 
    }); 

    // Should still pass 
    it ('should call our callback twice', function() { 
     expect(callback).to.have.been.calledTwice; 
    }); 

    // Passes with correct args 
    it('should call glob once', function() { 
     expect(globCb).to.have.been.calledOnce; 
     // inspect the arg values with .calledWithArgs 
     expect(globCb.calledWithArgs(err, files)).to.be.true; 
     // inspect the arg values with .getCall(index) (actually grabs the call args on the first call to globSpy) 
     expect(globCb.getCall(0).args[0]).to.equal(err); 
     expect(globCb.getCall(0).args[1]).to.equal(files); 
    }); 
)}; 
)};