gpt4 book ai didi

angularjs - 为什么使用 ngMock 包装第三方 Promise 时 $q.when 无法解析?

转载 作者:行者123 更新时间:2023-12-02 22:48:28 25 4
gpt4 key购买 nike

给定以下服务:

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 不同的调度程序。 Angular 通过异步队列上的 evalAsync 安排 Promise。不同的 Promise 库可能会以不同的方式安排 Promise - 在 native Promise 的用例中,它通过称为“微任务队列”的东西进行安排。

当您调用 $rootScope.$apply 时,它会“刷新 evalAsync 队列”,因为摘要循环正在运行,这会模拟“异步”并让您测试 Promise。

您无法使用 native Promise 以这种方式“欺骗”计时器,因此您必须编写一个实际上异步的测试。

你不能使用 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`
});

无论如何,我觉得它看起来好多了:)

关于angularjs - 为什么使用 ngMock 包装第三方 Promise 时 $q.when 无法解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32609735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com