gpt4 book ai didi

javascript - 在 Karma 单元测试中解决嵌套的 AngularJS promise

转载 作者:行者123 更新时间:2023-11-30 16:51:17 25 4
gpt4 key购买 nike

我尝试测试一个使用嵌套 promise 的函数(假设此函数无法更改)。要处理这些 promise ,我必须至少调用 $rootScope.$digest() 两次。我想出了这个可行的解决方案,每 10 毫秒调用一次 $digest()

// Set some async data to scope.key
// Note: This function is just for demonstration purposes.
// The real code makes async calls to localForage.
function serviceCall(scope, key) {
var d1 = $q.defer(), d2 = $q.defer();

setTimeout(function () {
d1.resolve('d1');
});

d1.promise.then(function (data) {
setTimeout(function () {
d2.resolve(data + ' - d2');
}, 100); // simulate longer async call
});

d2.promise.then(function (data) {
scope[key] = data;
});
}

it('nested promises service', function (done) {
var interval = setInterval(function () {
$rootScope.$digest();
}, 10),
myKey = 'myKey',
scope = {};

serviceCall(scope, myKey);

setTimeout(function () {
expect(scope[myKey]).toEqual('d1 - d2');
window.clearInterval(interval);
done();
}, 120); // What is the right timeout?
});

问题是估计消化足够的时间来解决所有 promise 所需的超时持续时间。如果服务进行真正的异步调用,例如,它会变得更加复杂。本地存储。

还有其他方法可以解决这个问题吗?有没有办法获得所有剩余的 promise ?

最佳答案

您应该使用 jasmine spy 来模拟/ stub 任何外部服务调用,以便您可以控制服务何时解析/拒绝。您的服务应该有测试来支持其内部功能。

请注意此示例并不完美,但为了清晰起见进行了缩写。

var service = jasmine.createSpyObj('service', ['call']);
var defServiceCall;
var $scope;

beforeEach(function () {
module('myModule', function ($provide) {
// NOTE: Replaces the service definition with mock.
$provide.value('service', service);
});
inject(function($q, $rootScope) {
$scope = $rootScope.$new();
defServiceCall = $q.defer();
service.call.and.returnValue(defServiceCall.promise);
});
});
describe('When resolved', function () {
beforeEach(function () {
myFunctionCall(); // Sets myVar on the scope
defServiceCall.resolve('data');
$scope.$digest(); // NOTE: Must digest for promise to update
});
it('should do something awesome when resolved', function () {
expect($scope.myVar).toEqual('data');
});
});

关于javascript - 在 Karma 单元测试中解决嵌套的 AngularJS promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30489122/

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