2014-05-21 112 views
2

在角JS工廠變量我想測試questionsBucket在這個製造工廠如何測試使用茉莉花

.factory('QA', function(ShuffleArray, RandWords){ 
     var answersBucket = RandWords.get(9); 
     var questionsBucket = answersBucket; 
     var questionToRemove, answers, question; 

     var QA = { 
      answers: function(amount){ 
       if(typeof(amount) === 'undefined') amount = 3; 

       answers = ShuffleArray.shuffle(answersBucket).slice(0,amount); 
       return answers; 
       }, 
      question: function(){ 
       questionToRemove = questionsBucket.indexOf(answers[Math.floor(Math.random() * 3)]); 
       question = questionsBucket.splice(questionToRemove, 1)[0]; 
       return question; 
       } 
      }; 
     return QA; 
     }); 

正如你可以看到questionsBucket是不是在QA對象返回一個變量,我不想讓它暴露於任何使用它的東西。

在Ruby中,有很多方法可以獲取這些數據或訪問私有方法,但我無法看到如何在Angular中執行此操作。

以下是我想如何在Jasmine中編寫測試的方法。

it('should remove a question from the questionsBucket', 
    inject(function(QA){ 
    var answers = QA.answers(5); 
    var question = Qa.question(); 

    //I can't access the questionBucket :(
    expect(QA.questionsBucket).toEqual(4); 

    })); 

回答

6

如果你想在你的工廠測試它,返回它或返回一個函數來獲取它。

.factory('QA', function(ShuffleArray, RandWords){ 
    var answersBucket = RandWords.get(9); 
    var questionsBucket = answersBucket; 
    var questionToRemove, answers, question; 

    var QA = { 
     //return it--> 
     questionsBucket: questionsBucket, 
     //return a way to get it--> 
     getQuestionsBucket: function(){ 
      return questionsBucket; 
     }, 
     answers: function(amount){ 
      if(typeof(amount) === 'undefined') amount = 3; 

      answers = ShuffleArray.shuffle(answersBucket).slice(0,amount); 
      return answers; 
      }, 
     question: function(){ 
      questionToRemove = questionsBucket.indexOf(answers[Math.floor(Math.random() * 3)]); 
      question = questionsBucket.splice(questionToRemove, 1)[0]; 
      return question; 
      } 
     }; 
    return QA; 
    }); 

另一種選擇是使用一個服務,而不是和返回questionsBucket作爲服務的成員:

.service('QA', function(ShuffleArray, RandWords){ 
    var answersBucket = RandWords.get(9); 
    this.questionsBucket = answersBucket; 
    var questionToRemove, answers, question; 

    this.answers= function(amount){ 
     if(typeof(amount) === 'undefined') amount = 3; 

     answers = ShuffleArray.shuffle(answersBucket).slice(0,amount); 
     return answers; 
    }; 
    this.question= function(){ 
     questionToRemove = questionsBucket.indexOf(answers[Math.floor(Math.random() * 3)]); 
     question = questionsBucket.splice(questionToRemove, 1)[0]; 
     return question; 
    }; 
    }); 

或者 - 你可以創建另一個服務/供應商/工廠,注入到這一點你QA服務/工廠:

app.service('Buckets', function(RandWords){ 
    this.answers = RandWords.get(9); 
    this.questions = answersBucket; 
}); 
app.service('QA', function(ShuffleArray, Buckets){ 
    this.answersBucket = Buckets.answers; 
    this.questionsBucket = Buckets.questions; 
    /*all the rest here - omitted for brevity*/ 
}); 
+0

是的,我已經實現了第一種方式,但我真的不希望questionBucket可以在普通代碼中訪問。我只是想知道是否有辦法將它設置爲一個私有變量,但他們讓測試訪問它? –

+1

沒有。沒有關閉或處理它,你不能這樣做;然而,就你而言,你可能會發現將'questionsBucket'和'answersBucket'移入他們自己的服務/提供者/工廠並將其注入到任何需要它的地方都是有好處的。然後,您可以正確地分離並測試注射劑作爲自己的東西。 –