2016-07-15 31 views
2

Wie kann ich mit dem Sinon-Paket einen Methodenaufruf stub/mock machen, bei dem einer der Parameter, die ich mocken muss, mit einer Pfeilfunktion aufgerufen wird? ZBVerspotten einer Methode, die mit einer Pfeilfunktion als Parameter aufgerufen wird

let objWithMethod = { method : function(x) {}; }; 
function SUT() { 
    // use case 
    let x = 'some value'; 
    let y = { anotherMethod : function(func) {}; }; 

    // I want to test that `y.anotherMethod()` is called with 
    // `(x) => objWithMethod.method(x)` as the argument 
    y.anotherMethod((x) => objWithMethod.method(x)); 
} 

let mockObj = sinon.mock(objWithMethod); 

// Both of these fail with a "never called" error 
mockObj.expects('method').once().withArgs(objWithMethod.method.bind(this, x)); 
mockObj.expects('method').once().withArgs((x) => objWithMethod.method(x)); 

SUT(); 
mockObj.verify(); 

Ich konnte nichts in den Sinon-Dokumenten noch nach ein paar Versuchen bei einer Google-Suche finden.

+0

Sie greifen nicht auf "objWithMethod.method" in Ihrem Code zu. 'objWithMethod' ist ein Objekt, während Sie es als Funktion bezeichnen. Wie funktioniert es überhaupt? – zerkms

+0

Ihr Code verursacht 'VM604: 5 Uncaught TypeError: objWithMethod ist keine Funktion' (nachdem Sie ein Problem mit zusätzlichen'; 'in der ersten Zeile) – zerkms

+0

haben Sie Recht mein Beispiel ist nicht korrekt, was ich im Frage ich werde aktualisieren es – Derek

Antwort

0

Lockere Matches Sie versuchen können zu tun mit matchers getan werden, gegen jede Funktion vergleichen sollte es

mockObj.expects('method').withArgs(sinon.match.func) 

werden, und es wird scheitern, weil objWithMethod.method gar nicht aufgerufen wird.

Diese

// I want to test that y.anotherMethod() is called with

// (x) => objWithMethod.method(x) as the argument

nicht getan werden kann, da der Code nicht mit Tests in Verstand geschrieben wurde. JS kann keine lokalen Variablen wiedergeben, und SUT Funktion ist eine Blackbox.

Um für Tests erreichbar zu sein und eine 100% ige Abdeckung zu erhalten, sollte jede Variable und jeder Verschluss der Außenwelt ausgesetzt sein.