2016-04-29 21 views
0

ローカル変数でサービスをテストする必要がありますが、ローカル変数を使用しないメソッドの一部は正常ですが、サービススコープで変数が定義されていないために失敗します。ここに私のコードは次のとおりです。ジャスミンで角度サービスをテストする

(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; 
     } 
    } 
})(); 

、これは私のテストで:

(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); 
     })); 




    }); 
})(); 

どのように私は、このサービスをテストすることができますか?

+0

テストに失敗した場合は、そのエラーを知ることがうれしいでしょう。すべてのテストで同じものを使うのではなく、 'it'関数のそれぞれでmockDisplayを定義して初期化してみませんか? –

+0

「バグではなく、機能です」同じmockDisplayを使うのは理にかなっています。このアプリは一種のcalcです。私が数字を挿入するたびに、前の数字を書き換えたり、それらを連結したりする必要があります。最後のテストが55から5に変更する必要があるまでは大丈夫です.55を挿入して分け前のサインが失敗した後、5で55を書き直すのを待っています。次のテストは等しいテストでなければなりません。しかし、この失敗したテストでは、nextNumberが定義されていないので、5が来ると555になるという問題があります。 – Filosssof

+0

どのように失敗し、どの変数が未定義ですか? – estus

答えて

1

それは

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

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

ローカル変数が掲揚されるべきである、との早期復帰は彼らがundefinedされます。

ローカル変数への依存関係は、サービスの内部状態を反映するプライベートプロパティとして公開され、嘲笑されたり検証されたりすると問題になりません。

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

return obj; 
+0

はい、あなたは正しいです。私はそれを修正し、今は未定義ではありません。ありがとう。しかし、私の悩みに対する答えは、これらすべてのテストを1つに含めることです。 – Filosssof

+1

@Filosssof実際には、そうではありません。ユニットテストでは、ユニットを単独で効率的にテストすることができます。テスト用の優れた設計は、ローカル変数をプライベートサービスプロパティとして公開することで、サービスの状態全体を各仕様に合わせることができます。 – estus

+0

私はあなたに同意する、私は孤立して私はいくつかの数字を挿入する必要があります前に、分割ボタンをテストすることができ、私は等しいメソッドを呼び出すだろうかわからない。そして、このテストは一種の統合テストになります。 – Filosssof

関連する問題