2015-07-23 19 views
6

Sto completando una migrazione da Jasmine 1.3 a 2.0. Finora ho refactored la maggior parte del codice per conformarsi alla sintassi più recente 2.0. Tuttavia, un certo tipo di test sta ancora fallendo.La spia Jasmine si aspetta di essere chiamata con "Oggetto (...)"

In breve, il mio test si presenta come segue:

var obj = new CustomCriteria(); 

spyOn(my, "function"); 
my.function(obj); 
expect(my.function).toHaveBeenCalledWith({ big: "fat object" }); 

mia CustomCriteria classe:

var CustomCriteria = function() { 
    this.big = "fat object"; 
}; 

Il test ha esito negativo con il seguente:

Expected spy function to have been called with [ Object({ big: "fat object" }) ] but actual calls were [ ({ big: "fat object" }) ]. 

Si noti come l'aspettativa ha un "Object" che lo avvolge, ma il secondo no. Questo test non ha avuto esito negativo in < 2.0 di Jasmine, ma ora non funziona dopo aver aggiornato Jasmine. Come posso risolvere questo?

Aggiornamento: Ho armeggiato intorno con la creazione di un nuovo oggetto tramite new ing un function vs. oggetto la sintassi letterale, e sembra che le __proto__ s sono diversi. Forse questo influenza il paragone sull'uguaglianza di Jasmine?

+0

puoi creare una nuova CustomCrizieria e superarla? –

+0

Visto che hai tutte le risorse necessarie nel tuo ambito di test, puoi anche controllare '.toHaveBeenCalledWith (obj)' – Phil

risposta

3

Prima della versione 2, gli oggetti sono uguali se hanno le stesse proprietà e valori (vedi v1.3.1 code)

Dalla versione 2 in poi, i costruttori oggetto vengono confrontati anche (vedi v2.0 code).

Nel tuo caso: CustomCriteria e {} non hanno lo stesso costruttore.

P.S .: Anche il messaggio di eccezione è stato modificato in modo da contenere il nome del costruttore in esso.

1

var x = {a: 1}; var y = {a: 1};

x e y non supereranno il confronto in gelsomino (che credo utilizzi ===) perché x e y sono solo riferimenti ai letterali degli oggetti.

expect (my.function) .toHaveBeenCalledWith (obj) non fallirebbe poiché i riferimenti all'oggetto corrisponderebbero. È possibile controllare gli argomenti della chiamata utilizzando my.function.calls per controllare l'uguaglianza di determinati campi se non si dispone del riferimento all'oggetto esatto da confrontare.

Problemi correlati