2012-05-16 12 views
17

Ich habe ein vollständiges vereinfachtes Beispiel erstellt, das das Problem repliziert, das ich bekomme.kann jasmine.any (Funktion) nicht arbeiten

function TestObj() { 
    var self = this; 
    self.getStuff = function(aString, callback) { 
     // TODO 
    } 
} 

describe("server communications", function() { 
    it("it calls the server", function() { 
     var obj = new TestObj(); 
     obj.getStuff = jasmine.createSpy(); 
     // swap the above line for this and it makes no difference 
     // spyOn(obj, "getStuff"); 

     var functionVar = function() { 
     }; 

     obj.getStuff("hello", functionVar); 

     expect(obj.getStuff).toHaveBeenCalledWith(
       [ "hello", jasmine.any(Function) ]); 
    }); 
}); 

Statt einer Leiteinheit Test, erhalte ich die folgende Ausgabe:

Erwarteter Spion mit genannt worden zu sein: [[ 'Hallo', < jasmine.any (Funktion Funktion() {[native Code]})>]] aber hieß mit: [[ 'Hallo', Funktion]]

Warum ist es nicht zu erkennen, dass die Funktionen, die ich in (function() übergeben {}) sind eigentlich func tionen? Was ist das native Code-Zeug, das es erwartet? Hat jemand anderes dieses Problem mit Jasmine.any (Function)? Vielen Dank!

EDITED versuchte ich spyOn statt jasmine.createSpy() und es macht keinen Unterschied verwenden. Ich habe nur ein einziges Argument versucht und es funktioniert. Die Einführung des ersten String-Arguments bricht die Jasmine.any (Function) - irgendwelche Ideen?

Antwort

31

Ah, ich dachte, Sie mussten das Argument einschließen s von expect().toHaveBeenCalledWith in einem Array[]. Wie dumm von mir. Hier ist eine funktionierende Version:

function TestObj() { 
    var self = this; 
    self.getStuff = function(aString, callback) { 
     // TODO 
    } 
} 

describe("server communications", function() { 
    it("it calls the server", function() { 
     var obj = new TestObj(); 
     obj.getStuff = jasmine.createSpy(); 
     // swap the above line for this and it makes no difference 
     // spyOn(obj, "getStuff"); 

     var functionVar = function() { 
     }; 

     obj.getStuff("hello", functionVar); 

     expect(obj.getStuff).toHaveBeenCalledWith("hello", jasmine.any(Function)); 
    }); 
}); 
7

Das Problem ist die Art und Weise Sie Ihren Spion erstellen, mit spyOn scheint wie erwartet zu funktionieren:

describe("test", function() { 
    return it("is function", function() { 
    var a = {b: function(){}}; 
    spyOn(a, 'b'); 
    a.b(function(){}); 
    expect(a.b).toHaveBeenCalledWith(jasmine.any(Function)); 
    }); 
}); 

Sie könnten auch write your own Matcher testen, ob der übergebene Wert ist eine Funktion:

describe('test',function(){ 
    it('is function',function(){ 

    this.addMatchers({ 
     isFunction: function() { 
     return typeof this.actual === 'function'; 
     } 
    }); 
    expect(function(){}).isFunction(); 
    }); 
}); 

EDITED: kodifizierte den ersten Code Chunk

+0

Siehe meine Änderungen zu meiner ursprünglichen Antwort. Ich habe SpyOn ausprobiert - kein Unterschied. Haben Sie ein Beispiel dafür bekommen, mit mehreren Argumenten zu arbeiten? –

+0

zerschmissen - behoben. Danke für deine Antwort. –

Verwandte Themen