2017-02-03 3 views
0

Ich habe Funktion in meinem Modul, die einen AJAX-Aufruf macht, und bei Erfolg leitet es den Benutzer um. Ich wollte diese Funktion in Jasmine testen, aber ich kann die Seite nicht neu laden.Jasmine spyOn ruft ursprüngliche Funktion

Hier ist meine Funktion:

function my_func() { 
    $.ajax({ 
     // parameters 
     success: function(data) { 
      // does something 
      reloadPage(path); 
     } 
    }); 
}  
function reloadPage(path) { 
    console.log('got here'); 
    window.location.href = path; 
} 

In meinem Test habe ich mit dem Reload-Seite Funktion auszuspionieren:

spyOn($, 'ajax').and.callFake(function(options) { 
    options.success(data); 
}); 
spyOn(my_module, 'reloadPage'); 
my_module.my_func(); 

Und wenn ich meine Tests laufen bekomme ich diese:

LOG LOG: 'got here' 
Firefox 42.0.0 (Linux 0.0.0) ERROR 
    Some of your tests did a full page reload! 

Sollte nicht reloadPage durch einen Spion ersetzt und nicht aufgerufen werden? Ich habe alle relevanten Code-Teile, es ist "buchstäblich" nur das, aber wenn Sie mich brauchen, um weitere Informationen zur Verfügung zu stellen, lassen Sie es mich wissen!

+0

Haben Sie versucht, die Reihenfolge des Aufbaus des Spions tauschen? – Dan

+0

Ja, immer noch der gleiche Fehler. – Vedran

Antwort

1

Ihr Code fehlt ein gefälschter Aufruf zum Fenster neu laden (reloadPage Funktion). Auch fehlt Ihnen die this Referenz von der Erfolgsfunktion.

Hier ist, wie ich Ihren Code geändert habe und es jetzt funktioniert. Sie können sie sehen in Aktion here

var my_module = { 
    my_func: function() { 
    var self = this; 
    $.ajax({ 
     url: 'abc', 
     success: function(path) { 
     // does something 
     self.reloadPage(path); 
     } 
    }); 
    }, 
    reloadPage: function(path) { 
    console.log('got here'); 
    window.location.href = path; 
    } 
} 

describe('reload page test', function() { 
    it('test reload', function() { 
    spyOn(my_module, 'reloadPage').and.callFake(function(e) { 
     console.log("This is a spy call for reload page"); 
    }); 
    spyOn($, 'ajax').and.callFake(function(e) { 
     e.success('some window url path'); 
    }); 
    my_module.my_func(); 
    expect(my_module.reloadPage).toHaveBeenCalled(); 
    }) 
}); 
+0

Das hat den Trick gemacht. Vielen Dank! – Vedran

Verwandte Themen