2016-05-05 10 views
1

Ich schreibe Testfälle für NODE JS API. Aber wo immer console.log() in Routen oder Diensten von NODE JS File vorhanden ist, wird es in CLI gedruckt. Gibt es eine Möglichkeit, diese zu verspotten, so dass diese nicht in CLI gedruckt werden.
Mocking console.log()/Jede andere Funktion in MOCHA-Test-Framework

Ich habe ein paar Bibliotheken wie Sinon, Stub für Spott erforscht. Aber konnte die Arbeit dieser Bibliotheken nicht erfassen.

Antwort

0

Sie können die Funktion vollständig überschreiben: console.log = function() {}.

+0

Aber Gibt es eine Möglichkeit console.log zu verspotten? Ich denke, das wird die beste Lösung sein, um Testfälle zu schreiben. –

+0

Dies ist Spott console.log. Was hast du vor, wenn du "Spott" sagst? –

+0

Verspotten beim Schreiben von Testfällen bedeutet, ich möchte nicht, dass diese Funktion ausgeführt wird, aber ich kann jede Eingabe geben und auch ausgegeben werden. Mocking DB-Verbindung, API-Aufrufe. Ich hoffe du hast es verstanden. –

0

Sie könnten etwas in der Art tun, wie diese Vorher/Nachher-Blöcke zu Ihren Tests hinzugefügt werden, aber das Problem ist, dass Mocha console.log verwendet, um die hübschen Nachrichten über die Ergebnisse des Tests zu drucken, damit Sie diese verlieren

describe('Test Name', function() { 
    var originalLog; 
    beforeEach(function() { 
    originalLog = console.log; 
    console.log = function() {}; 
    }); 
    // test code here 
    afterEach(function() { 
    console.log = originalLog; 
    }) 
}) 

Das Problem ist, dass die Ausgabe aussehen würde wie

Test Name 


    X passing (Yms) 

Ohne Zwischentext

+1

können wir Bibliotheken wie Sinon, Stub verwenden, um diese zu verspotten? –

0

Sie sollten nicht tr y, um console.log selbst nachzuahmen, ist es besser, wenn Ihre Knotenmodule ein Protokollierungsobjekt verwenden. Auf diese Weise können Sie während des Tests eine Alternative (z. B. einen Schein) bereitstellen. Zum Beispiel:

<my_logger.js> 
module.exports = { 
    err: function(message) { 
     console.log(message); 
    } 
} 

<my_module.js> 
var DefaultLogger = require('my_logger.js'); 

module.exports = function(logger) { 
    this.log = logger || DefaultLogger; 
    // Other setup goes here 
}; 

module.exports.prototype.myMethod = function() { 
    this.log.err('Error message.'); 
}; 

<my_module_test.js> 
var MyModule = require('my_module.js'); 

describe('Test Example', function() { 
    var log_mock = { err: function(msg) {} }; 

    it('Should not output anything.', function() { 
     var obj = new MyModule(log_mock); 
     obj.myMethod(); 
    }); 
}); 

Der Code hier habe ich vereinfacht, da der eigentliche Test nicht der Grund für das Beispiel ist. Lediglich das Einfügen von alternativer Protokollierung.

Wenn Sie eine große Codebase mit vielen console.log-Aufrufen haben, ist es besser, den Code einfach zu aktualisieren, wenn Sie Tests für jede Methode hinzufügen. Wenn Sie Ihre Protokollierung auf diese Weise aktivieren, wird Ihr Code einfacher und empfänglicher für Tests. Außerdem sind viele Protokollierungs-Frameworks für Knoten verfügbar. console.log ist während der Entwicklung in Ordnung, wenn Sie nur etwas ausgeben wollen, um zu sehen, was gerade passiert. Versuchen Sie jedoch, wenn möglich, die Verwendung als Protokollierungslösung zu vermeiden.

0

ich nicht eine Lösung, die nur versteckt die console.log Anrufe im Modul der Anrufe des Test-Framework (Mokka/chai in meinem Fall) getestet werden, und spottet keine finden konnte.

kam ich mit der Verwendung einer Kopie von console im App-Code oben:

/* console.js */ 
module.exports = console; 

/* app.js */ 
const console = require('./console'); 
console.log("I'm hidden in the tests"); 

/* app.spec.js */ 
const mockery = require('mockery'); 
var app; 

before(() => { 
    // Mock console 
    var consoleMock = { 
    log:() => {} 
    } 
    mockery.registerMock('./console', consoleMock); 
    // Require test module after mocking 
    app = require('./app'); 
}); 

after(() => { 
    mockery.deregisterAll(); 
    mockery.disable(); 
}); 

it('works',() => {});