2016-05-02 19 views
0

Ich versuche, Jasmin-Tests für ein Modul zu schreiben (sagen wir ModulA), die ein anderes Modul- (ModulB) "erfordert".Wie eine Methode in einem abhängigen Modul mit Jasmine-Knoten ausspionieren

======> moduleB.js

function moduleBFunction(){ 
    console.log('function inside moduleB is called'); 
} 

======> moduleA.js

var moduleB = require('./moduleB'); 
function moduleAfunction(input){ 
    if(input){ 
     moduleB.moduleBFunction() 
    } 

} 

Ich möchte ein Jasmin Testfall schreiben, wenn ich Tests Rufen Sie moduleAfunction auf, ruft sie moduleBfunction auf oder nicht. Ich habe versucht, einen Test mit spyOn() zu schreiben. aber ich bin mir nicht sicher, wie ich eine Methode in einem abhängigen Modul vortäuschen kann. Ich habe einige Nachforschungen und fand ich in der Lage sein könnte, wie unter

var moduleB = require('../moduleB'); 
moduleB.__set__('moduleBfunction', moduleBfunctionSpy); 
moduleA.__set__('moduleB', moduleB); 
it('should call moduleBfunction', function(){ 
    moduleA.moduleAfunction() 
    expect(moduleB.moduleBfunction()).toHaveBeenCalled() 
}); 

‚rewire‘ Modul für diesen Zweck zu verwenden, aber ich fühle mich sollte es ein einfacher Weg sein.

Bitte vorschlagen.

Antwort

2

Ich empfehle sinon.js

var sinon = require('sinon') 
var moduleA = require('../moduleA') 
var moduleB = require('../moduleB') 


it('should call moduleBfunction', function() { 
    var stub = sinon.stub(moduleB, 'moduleBfunction').returns() 
    moduleA.moduleAfunction() 
    expect(moduleB.moduleBfunction.calledOnce) 
    stub.restore() 
}) 

Sie können leicht fälschen viele verschiedene Verhaltensweisen wie:

  • Stub
  • Stummel wirft einen bestimmten Wert zurückgibt
  • Stub Erträge (imitiert asynchroner Rückruf)
  • Stummel arbeitet mit nur für bestimmte Eingabeargumente beschränkt

Vergessen Sie nicht zu wiederherstellen jeder Stummel bevor der nächste Test ausgeführt wird. Es ist am besten, Sandboxes zu verwenden und afterEach/beforeEach

describe('tests which require some fakes', function() { 
    var sandbox 

    beforeEach(function() { 
    sandbox = sinon.sandbox.create() 
    }) 

    afterEach(function() { 
    sandbox.restore() 
    }) 
})