【问题标题】:AngularJS + Jasmine + handle of promisesAngularJS + Jasmine + Promise 句柄
【发布时间】:2015-11-04 09:04:53
【问题描述】:

我正在使用 angularjs 1.4jasmine 2.4

我试图测试一个函数,我想让它返回一个承诺,所以它上面的另一层可以处理可能的值。

我的问题是函数首先验证输入。如果他们不是正确的,我想返回一个被拒绝的承诺否则它将做它必须做的任何事情并履行承诺

以下是相关 emailSvc 函数的一部分:

// Function found in the emailSvc
    this.sendEmail = function sendEmail(apiKey, token, email_type)
    {

      // Prerequisite to send email
      if(!apiKey) {
        return $q.when("apiKey not present.");
      }

      var deferred = $q.defer();

      // Ajax call
      serviceApiEmail.send(apiKey, token, email_type)
          .then(function(data){
              deferred.resolve(data);
          })
          .catch(function(e){
              deferred.reject(e);
          })

      return deferred.promise;
    }

我的测试用例如下:

        it('should reject sending email if apiKey is not present', function(){

          var rejectEmail;

          var apiKey,
              verifyToken = acceptedVerifyToken,
              emailType = const_EMAIL_TYPE.SIGNUP;

          i_emailSvc.sendEmail(apiKey, verifyToken, emailType)
            .then(function(){

              // It should not come here
              rejectEmail = false;

            }).catch(function(){

              rejectEmail = true;

            });

            // It comes here without executing any success or fail promise handlers                
             expect(rejectEmail).toBe(true);
        });

问题在于当拒绝承诺时,catch 永远不会被执行。我相信这是我对承诺的误解。

任何想法为什么捕获然后在这里不起作用?

【问题讨论】:

    标签: angularjs jasmine q


    【解决方案1】:

    如果在使用$q.when()apiKey 不存在,则您正在解决承诺。这将表明一个成功完成的承诺。要指示失败,您应该使用$q.reject

    if(!apiKey) {
        return $q.reject("apiKey not present.");
    }
    

    另外,要在测试中执行 thencatch 回调,您通常需要触发摘要循环。执行此操作的通常方法是测试是获取对$rootScope 的引用并调用$rootScope.$digest()

    【讨论】:

    • 你是对的。我错过了触发 $digest 循环。发生这种情况是因为我一直在使用 $httpBackend 和 flush 功能而没有问题。现在我意识到,flush 函数实际上可能正在触发一个 $digest 循环,以使用我们放入响应(200,“ok”)的任何内容来解决承诺。谢啦!现在一切都说得通了。
    • 对,这就是为什么我问你是否确定你达到了它。并且不需要 $q.reject() ,这就是 deferred 已经在做的事情..
    • @Maarten,当serviceEmailApi.send 被拒绝时,deferred 正在拒绝承诺。但是,我将测试阅读为测试保护子句 (falsey apiKey),在问题中调用 $q.when,这将导致已解决的承诺。
    【解决方案2】:

    你在嘲笑 serviceApiEmail.send 方法吗?你达到那个时候了吗?我会检查其他东西然后rejectEmail布尔值,因为使用Javascript,即使没有达到'then'部分,你的测试也会是错误的,所以你甚至可能没有达到promise resolve part

    【讨论】:

    • 这是因为缺少摘要周期。基托斯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2021-03-17
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多