2012-05-16 27 views
17

Stworzyłem kompletny uproszczony przykład, który replikuje problem, który otrzymuję.nie można uzyskać jaśminu. (Funkcja) do pracy

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) ]); 
    }); 
}); 

Zamiast testów jednostkowych mijania, pojawia się następujący komunikat:

Oczekiwane szpieg zostały nazwie z: [[ 'Hello', < jasmine.any (funkcja function() {[natywny kod]})>]] ale został wywołany z: [[ 'cześć', funkcja]]

Dlaczego nie jest to uznając, że funkcje mijam w (function() {}) w rzeczywistości są func Tions? Czego oczekuje ten kod natywny? Ktoś jeszcze miał ten problem z jasmine.any (funkcja)? Dziękuję Ci!

EDITED

Próbowałem za pomocą spyOn zamiast jasmine.createSpy(), a to sprawia, że ​​nie ma różnicy. Próbowałem tylko jednego argumentu i to działa. Wprowadzenie pierwszego argumentu ciągu łamie jasmine.any (funkcja) - wszelkie pomysły?

Odpowiedz

31

Ah, myślałem, że musisz zamknąć argumentację s z expect().toHaveBeenCalledWith w Array[]. Głupi ja. Oto działająca wersja:

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

Problemem jest sposób stworzyć swój szpiega, używając spyOn wydaje się działać zgodnie z oczekiwaniami:

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)); 
    }); 
}); 

Można również write your own Matcher aby sprawdzić, czy przekazywana wartość jest funkcją:

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

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

EDYTOWANY: skodyfikowany pierwszy fragment kodu

+0

Zobacz moje zmiany w mojej oryginalnej odpowiedzi. Próbowałem spyOn - bez różnicy. Czy masz przykład do pracy z wieloma argumentami? –

+0

nevermind - naprawiono. Dzięki za odpowiedź. –

Powiązane problemy