2012-01-10 10 views
49

Właśnie zacząłem używać Jasmine, więc proszę wybaczyć pytanie początkującego, ale czy możliwe jest testowanie typów obiektów podczas korzystania z toHaveBeenCalledWith?Używanie typów obiektów z Jasmine do HaveBeenCalledWith method

expect(object.method).toHaveBeenCalledWith(instanceof String); 

Wiem, że mogłem to, ale sprawdzam wartość zwracaną zamiast argumentu.

expect(k instanceof namespace.Klass).toBeTruthy(); 

Odpowiedz

43

toHaveBeenCalledWith to metoda szpiega. Więc można tylko nazwać je na szpiega jak opisano w docs:

// your class to test 
var Klass = function() { 
}; 

Klass.prototype.method = function (arg) { 
    return arg; 
}; 


//the test 
describe("spy behavior", function() { 

    it('should spy on an instance method of a Klass', function() { 
    // create a new instance 
    var obj = new Klass(); 
    //spy on the method 
    spyOn(obj, 'method'); 
    //call the method with some arguments 
    obj.method('foo argument'); 
    //test the method was called with the arguments 
    expect(obj.method).toHaveBeenCalledWith('foo argument'); 
    //test that the instance of the last called argument is string 
    expect(obj.method.mostRecentCall.args[0] instanceof String).toBeTruthy(); 
    }); 

}); 
+1

Andreas, jest jakiś powód, dla którego dodaje '.toBeTruthy()'? Wygląda na to, że nie jest to konieczne. – gwg

+1

@ gwg "oczekiwać (foo)' bez matchera jest no-op; linia nie zrobiłaby nic bez wywołania 'toBeTruthy()'. Zobacz dowód: http://jsfiddle.net/2doafezv/2/. –

+4

To jest nieaktualne; 'obj.method.mostRecentCall' musi stać się [' obj.method.calls.mostRecent() '] (http://jasmine.github.io/2.0/introduction.html#section-Inne_tracking_properties) w Jasmine 2.0. Również użycie 'jasmine.any()', jak opisano w innej odpowiedzi, jest jaśniejsze i bardziej przejrzyste. Wreszcie, ta odpowiedź zajmuje trochę czasu, aby dojść do sedna; zasadniczo wszystko, co napisałeś poza 'expected (obj.method.mostRecentCall.args [0] instanceof String) .toBeTruthy();' tak naprawdę nie jest potrzebne do wytłumaczenia siebie. –

84

odkryłem jeszcze lepszy mechanizm, za pomocą jasmine.any(), znajdę biorąc argumenty oprócz ręcznie być nieoptymalne dla czytelności.

W coffeescript:

obj = {} 
obj.method = (arg1, arg2) -> 

describe "callback", -> 

    it "should be called with 'world' as second argument", -> 
    spyOn(obj, 'method') 
    obj.method('hello', 'world') 
    expect(obj.method).toHaveBeenCalledWith(jasmine.any(String), 'world') 
+16

jasmine.any (funkcja) jest przydatna, także –

+1

Zauważono, że działa również wewnątrz na referencjach. na przykład: 'expect (obj.method) .toHaveBeenCalledWith ({done: jasmine.any (Funkcja)})'. Bardzo przydatne. – fncomp

+1

to jest poprawna odpowiedź. – Cam

Powiązane problemy