加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 为什么$q.when在使用ngMock时包装第三方承诺时无法

发布时间:2020-12-17 17:15:04 所属栏目:安全 来源:网络整理
导读:鉴于以下服务: angular.module('app',[]) .service('promisey',function ($q) { this.cakey = function () { return $q.when('brownie') } this.fruity = function () { return $q.when(Promise.resolve('apple')) } }) ……以及以下测试: var self = this
鉴于以下服务:

angular.module('app',[])
  .service('promisey',function ($q) {
    this.cakey = function () {
      return $q.when('brownie')
    }
    this.fruity = function () {
      return $q.when(Promise.resolve('apple'))
    }
  })

……以及以下测试:

var self = this

describe('when',function () {
  var promisey
  var $rootScope

  beforeEach(module('app'))
  beforeEach(inject(function(_$rootScope_,_promisey_) {
    promisey = _promisey_
    $rootScope = _$rootScope_
  }))

  it('should give cakes',function (done) {
    promisey.cakey()
      .then(function (cake) {
        expect(cake).toBe('brownie')
      })
      .catch(self.fail.bind())
      .finally(done)
    $rootScope.$apply()
  })

  it('should give fruit',function (done) {
    promisey.fruity()
      .then(function (cake) {
        // XXX: does not resolve
        expect(cake).toBe('apple')
      })
      .catch(self.fail.bind())
      .finally(done)
    $rootScope.$apply()
  })
})

…当ngMock来源时,promisey.fruity()永远不会解决.如果我没有源ngMock(并自己处理angular.injector),测试将按预期解决.这是为什么?

可以在tlvince/q-when-reduced-test-case找到该问题的简化测试用例.

解决方法

这是因为本机promise使用与Angular不同的调度程序.角度调度通过其异步队列上的evalAsync进行承诺.不同的promise库可能会以不同的方式调度promise – 在本机promise的用例中,它通过称为“microtask队列”的东西进行调度.

当你调用$rootScope.$应用它“刷新evalAsync队列”,因为运行摘要周期,这模拟“异步”并让你测试promises.

你不能用本机承诺“欺骗”计时器,所以你必须编写一个实际上是异步的测试.

您不能使用ngMock并使用Mocha的promise语法:

it('should give fruit',function () { // no done
    return promisey.fruity() // see return here
      .then(function (cake) {
        expect(cake).toBe('apple')
      });
      // no digest,no `done`
  });

我觉得它看起来好多了:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读