2016-04-29 11 views
0

Ich muss einen Dienst mit lokalen Variablen testen einige Methoden, die lokale Variablen nicht verwenden, übergeben OK, aber einige von ihnen fallen, da die Variable in Dienstbereich nicht definiert ist. Hier ist mein Code:Testen von Winkeldienst mit Jasmine

(function() { 
    'use strict'; 

    angular.module('app').service('CalculatorService', CalculatorService); 

    function CalculatorService() { 

     return { 
      insertValue : insertValue, 
      equals : equals, 
      eraseNumber : eraseNumber, 
      makeOperation : makeOperation 
     } 

     var prevValue = 0; 
     var operation = ''; 
     var nextNumber = false; 

     function insertValue(digit, display) { 
      console.log("prevValue is: " + prevValue); 
      if (display === 0 || nextNumber) { 
       prevValue = display; 
       display = digit; 
       nextNumber = false; 
      } else { 
       display = display + '' + digit; 
      } 
      return display; 
     } 

     function equals(display,direct) { 
      if (operation === 'plus') { 
       display = parseInt(prevValue) + parseInt(display); 
      } 

      if (operation === 'minus') { 
       display = prevValue - display; 
      } 

      if (operation === 'mult') { 
       display = prevValue * display; 
      } 

      if (operation === 'divide') { 
       if (display === 0) { 
        display = 'Divide by 0'; 
       }else{ 
        display = prevValue/display; 
       } 

      } 
      nextNumber = true; 
      prevValue = display; 
      if(direct){ 
       operation=''; 
      } 


      return display; 
     } 

     function makeOperation(val, display) { 
      var firstTime = (operation==='' || operation===undefined); 
      var result = equals(display,false) 
      operation = val; 
      nextNumber = true; 
      if(firstTime){ 
       return display; 
      }else{ 
       return result; 
      } 

     } 

     function eraseNumber(display) { 
      display = 0; 
      operation = ''; 
      return display; 
     } 
    } 
})(); 

und dies ist mein Test:

(function(){ 
    'use strict'; 

    describe('Service: CalculatorService', function() { 
     beforeEach(module('app')); 

     var mockDisplay = 0; 

     it('should change display from 0 to 5', inject(function(CalculatorService) { 
      mockDisplay = CalculatorService.insertValue(5,mockDisplay); 
      expect(parseInt(mockDisplay)).toEqual(5); 

     })); 

     it('should change display from 5 to 55', inject(function(CalculatorService) { 
      mockDisplay = CalculatorService.insertValue(5,mockDisplay); 
      expect(parseInt(mockDisplay)).toEqual(55); 
     })); 


     it('should not change display (55)', inject(function(CalculatorService) { 
      mockDisplay = CalculatorService.makeOperation('divide',mockDisplay); 
      expect(parseInt(mockDisplay)).toEqual(55); 
     })); 

     it('should change display from 55 to 5', inject(function(CalculatorService) { 
      mockDisplay = CalculatorService.insertValue(5,mockDisplay); 
      expect(parseInt(mockDisplay)).toEqual(5); 
     })); 




    }); 
})(); 

Wie kann ich diesen Service testen?

+0

Wenn ein Test fehlschlägt, wäre es nett, den Fehler zu kennen. Warum definierst und initiierst du nicht mockDisplay in jeder deiner It-Funktionen, anstatt dasselbe für alle Tests zu verwenden? –

+0

"Es ist kein Fehler, es ist eine Funktion". Es macht Sinn, dasselbe mockDisplay zu verwenden. Diese App ist irgendwie kalkuliert. Jedes Mal, wenn ich eine Ziffer einfüge, muss sie sich entscheiden, die vorherige Ziffer neu zu schreiben oder sie zu verbinden. Es ist alles in Ordnung, bis der letzte Test "Anzeige von 55 auf 5 ändern" fehlschlägt, bevor ich 55 und Zeichen der Teilung einfügte, danach warte ich darauf, 55 mit 5 neu zu schreiben, der nächste Test sollte gleich Test sein und sollte 11 zurückgeben Aber in diesem gescheiterten Test ist das Problem, dass ich 5 erwarte und 555 bekomme, weil nextNumber nicht definiert ist – Filosssof

+0

Wie genau scheitern sie und welche Variablen sind nicht definiert? – estus

Antwort

1

Es sollte

var prevValue = 0; 
    var operation = ''; 
    var nextNumber = false; 

    return { 
     insertValue : insertValue, 
     equals : equals, 
     eraseNumber : eraseNumber, 
     makeOperation : makeOperation 
    } 

Lokale Variablen werden hochgezogen, und frühe Rückkehr veranlasst sein, sie undefined zu sein.

Die Abhängigkeit von lokalen Variablen hört auf, ein Problem zu sein, wenn sie als private Eigenschaften angezeigt werden, die den internen Status des Dienstes widerspiegeln, und können verspottet oder verifiziert werden.

var obj = { 
    _prevValue: 0, 
    _operation: '', 
    _nextNumber: false, 
    ... 
}; 

return obj; 
+0

Ja, Sie haben Recht. Ich habe es modifiziert und jetzt ist es nicht undefiniert. Vielen Dank. Aber die Antwort für mein Problem ist, dass alle diese Tests in einem enthalten sein sollten. – Filosssof

+1

@Filossssof Eigentlich sollten sie nicht. Unit Testing setzt voraus, dass die Einheiten einzeln effizient getestet werden können. Ein gutes testweises Design besteht darin, lokale Variablen als private Diensteigenschaften verfügbar zu machen, sodass der gesamte Dienststatus in jeder Spezifikation dargestellt werden kann. – estus

+0

Ich stimme dir zu, ich weiß nicht, wie ich den Divisions-Button isoliert testen kann, bevor ich einige Ziffern einfüge, und danach werde ich die gleiche Methode aufrufen. Und dieser Test wird eine Art Integrationstest sein. – Filosssof

Verwandte Themen