2016-05-13 20 views
0

Ich habe eine Reihe von Duplikaten für diese Frage gesehen, konnte aber das Problem nicht lösen.Jasmine Js - SpyOn Fakecall während der Controller-Initialisierung

Ich habe einen Controller und während der Controller-Initialisierung wird fetchtemplate() zuerst aufgerufen und dann wird mein Schein fetchtemplate() aufgerufen.

Wie kann ich verhindern, dass der tatsächliche (Controller) fetchtemplate() während der Initialisierung des Controllers aufgerufen wird? Meine Absicht ist es, die Funktion fetchtemplate() in meinem spec.Please zu spotten haben einen Blick auf meine spec -

describe("...",function(){ 
    beforeEach(inject(function($controller,...) { 
    scope  = $rootScope.$new(); 

    this.init = function() { 
        $controller('ChangeControlCreateController', { 
        $scope: scope 
        }); 
       } 
    })); 
    describe('Function', function() { 

     it("-- check for trueness",function(){ 

     this.init()  ; //Initialization of the controller 
     spyOn(scope,'fetchtemplate').and.callFake(function() { 
        return 101; 
       }); 
     var fakeResponse = scope.fetchtemplate(); 
     expect(scope.fetchtemplate).toHaveBeenCalled(); 
     expect(fakeResponse).toEqual(101);  
     }); 


    }); 
}); 

ich versucht habe, die spyOn vor dem this.init() platzieren, die Fehler als fetchtemplate() gab nicht an, dass existieren Zeit zu spionOn.

Mein Controller Codestruktur sieht aus wie -

angular.module('...', [...]) 

    .controller('ChangeControlCreateController', ["$scope"..., 
    function ChangeControlCreateController($scope,...) { 
     $scope.fetchtemplate = function() { 
      console.log("controller's function");    
      ... 
     }; 
     $scope.fetchtemplate(); 
    }); 

Das Ergebnis, was ich bekommen ist - Zuerst die Konsole Punkt „Funktion des Controllers“ und dann die Spezifikation mit Mock-Funktion ausgeführt wird. Ich möchte die Scheinfunktion ausführen ohne die Controller-Funktion ausführen

+0

können Sie uns den Controller-Code geben? Ich muss sehen, wie Sie diese fetchtemplate-Methode – sam

+0

sicher nennen, ich habe auch die Controller-Code-Struktur hinzugefügt. @sam – M3ghana

Antwort

1

Also, wenn ich richtig verstehe Sie tun einige Anrufe an eine Funktion, die etwas tut, was Sie zu Testzwecken verhindern wollen. Wahrscheinlich ein http-Aufruf oder etwas in der Art?

Was auch immer der richtige Weg ist, um so etwas zu handhaben, ist normalerweise, diese Methode in einen Dienst zu setzen und dann diese Dienstmethode auszuspionieren. Hier ist ein Beispiel für Test, wenn der Dienst TemplateService ist:

describe("...",function(){ 

var $controller, scope, TemplateService, YourController; 

beforeEach(inject(function(_$controller_, _TemplateService_, ...) { 
    scope = $rootScope.$new(); 
    $controller = _$controller_; 
    TemplateService = _TemplateService_; 
} 

it("-- check for trueness",function(){ 

    spyOn(TemplateService,'fetchTemplate').and.returnValue('101'); 

YourController = $controller('YourController'); 
    expect(...); 
}); 


}); 

Ich hoffe, dass nützlich ist

+0

Hallo Sam, danke für die Antwort. Kann ich das Problem lösen, ohne meine Funktion in den Dienst zu stellen? – M3ghana

+0

Sie könnten wahrscheinlich durch das Überschreiben von eckigen Grundverhaltensweisen oder durch andere Mittel, die ich noch nie herausgefunden habe. Wie du gesagt hast, kannst du nicht in etwas eingreifen, das noch nicht existiert – sam

+0

Okay, Danke. – M3ghana