2015-04-22 9 views
11

Ich versuche, über Sinon zu lernen und spionieren wollen console.log. Der Code ist einfach:Sinon Spion auf console.log Anruf nicht registriert

function logToConsole() { 
    console.log('Hello World'); 
} 

exports.logToConsole = logToConsole; 

Aber wenn ich es testen wollen, funktioniert es nicht, weil der Aufruf von console.log nicht innerhalb der zu testende System registriert ist:

var chai = require('chai'), 
    expect = chai.expect, 
    sinonChai = require('sinon-chai'), 
    sinon = require('sinon'), 
    sut = require('../src/logToConsole'); 

chai.use(sinonChai); 

describe('logToConsole', function() { 
    it('should spy on console.log', function() { 
     sinon.spy(console, 'log'); 

     sut.logToConsole(); 

     expect(console.log).to.have.been.called; 
    }); 
}); 

Allerdings, wenn ich ausführen console.log innerhalb des Tests selbst wird gefangen genommen und gelangt:

it('should spy on console.log', function() { 
    sinon.spy(console, 'log'); 

    sut.logToConsole(); 
    console.log('Test'); 

    expect(console.log).to.have.been.called; 
}); 

Interessanterweise nicht auf innere Funktion nutzen zu können auszuspionieren scheint überhaupt nennt. Ist das nicht der Zweck einer Spionage-Bibliothek?

z.B.

function a() {}; 

function b() { 
    a(); 
} 

Antwort

14

Es sieht aus wie Sie nicht wirklich sind sinon-chai verwenden, können Sie den Code schreiben ist diese Zeile fehlt:

chai.use(sinonChai); 

EDIT: Hier ist der Code, den ich getestet mit:

// test.js 
var chai = require('chai'), 
    expect = chai.expect, 
    sinonChai = require('sinon-chai'), 
    sinon = require('sinon'), 
    sut = require('./log'); 

chai.use(sinonChai); 

describe('logging', function() { 

    beforeEach(function() { 
    sinon.spy(console, 'log'); 
    }); 

    afterEach(function() { 
    console.log.restore(); 
    }); 

    describe('logToConsole', function() { 
    it('should log to console', function() { 
     sut.logToConsole(); 
     expect(console.log).to.be.called; 
    }); 
    }); 

    describe('logToConsole2', function() { 
    it('should not log to console', function() { 
     sut.logToConsole2(); 
     expect(console.log).to.not.be.called; 
    }); 
    }); 
}); 

// log.js 
module.exports.logToConsole = function() { 
    console.log('Hello World'); 
}; 

module.exports.logToConsole2 = function() { 
}; 
+0

Sorry vergessen, es in meine Frage zu schreiben, aber es ändert nichts. –

+1

@ninive Ich habe ein ausführlicheres Beispiel hinzugefügt, das für mich funktioniert. – robertklep

+0

Dies wird "Hallo Welt" auf die Testkonsole ausgeben - wie kann man das ausblenden? – maasha

Verwandte Themen