angularjs - 如何使用 Jasmine 在 Angular JS 工厂中测试变量

标签 angularjs unit-testing mocking jasmine bdd

我想在这个工厂测试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 中有很多方法可以获取此数据或访问私有(private)方法,但我看不到如何在 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);

  }));

最佳答案

如果你想在你的工厂测试它,返回它或者返回一个函数来获取它。

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

或者 - 您可以创建另一个服务/提供者/工厂并将其注入(inject)您的 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*/
});

关于angularjs - 如何使用 Jasmine 在 Angular JS 工厂中测试变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23781265/

相关文章:

xml - 如何设置spring上下文:component-scan to scan "src/main/java" instead of "src/test.java" in unit test env

mocking - 如何测试 SimpleJdbcCall

python - 如何在 Python 单元测试中将模拟对象注入(inject)实例属性

javascript - Jasmine spyOn 在 AngularJS 指令上无法正常工作

javascript - 从 AngularJS 中的长字符串中删除特定短语(替换函数 + 正则表达式?)

java - 如何对包含 CompletableFuture 的方法进行单元测试?

asp.net-mvc - 使用 MvcContrib TestHelper 时使用/模拟 Request.Url

python - 避免使用mock.patch将第二个参数传递给每个单元测试

javascript - 如何禁用 AngularJS 中的按钮?

angularjs - 如何将 Angular 2 与 NetBeans 一起使用?