我目前正在测试使用promises的自定义指令。
该指令代码段的第一部分结构如下:
angular.module('app').directive('simpleMock', [
'$q',
function ($q) {
'use strict';
return {
link: function ($scope) {
$scope.$watch('acc.mockPromise', function (promise) {
var sF;
$scope.sF = sF = {};
promise.then(function (res) {
sF.res = res;
return $q.when(res.fetchData());
}).then(function (data) {
sF.data = data;
return $q.when(sF.res.fetchLinks('create'));
}).then(function (links) {
if (!links.length) {
return $q.when(sF.res.fetchLinks('edit'));
}
return links;
})....
...............
我写的茉莉花测试规范有以下结构:
beforeEach(module('app'));
beforeEach(inject(function ($rootScope, $compile) {
when = modulejs.require('when');
sF = {};
res = jasmine.createSpyObj('res', ['fetchData', 'fetchLinks']);
sF.res = res;
res.fetchData.andReturn(when([{
href: 'http://promise.angularjs.com/',
name: 'undefined',
rel: 'rel',
title: "Fake link"
}]));
res.fetchLinks.andReturn(when([{
href: 'http://promise.angularjs.com/',
name: 'undefined',
rel: 'rel',
title: "Fake link"
}]));
compile = function (acc, res) {
var $childScope, $parentScope, element;
element = angular.element('<div simple-mock></div>');
$parentScope = $rootScope.$new();
$parentScope.acc = acc;
acc.mockPromise = res;
$childScope = $parentScope.$new();
$compile(element)($childScope);
$parentScope.$digest();
return $childScope;
};
getRootScope = function () {
return $rootScope;
}
}));
it('calls fetchData', function () {
var $scope, acc, $rootScope;
acc = {};
$scope = compile(acc, when(res));
$rootScope = getRootScope();
$scope.$apply();
$rootScope.$apply();
$rootScope.$apply();
$rootScope.$apply();
$scope.acc.mockPromise.then(function () {
expect($scope.sF.res.fetchData).toHaveBeenCalled();
});
在运行此测试时,控件不会进入指令代码的这一部分。
.then(function (data) {
sF.data = data;
return $q.when(sF.res.fetchLinks('create'));
[然而,控件进入前一行代码。]
这个问题的一个可能原因可能是承诺没有得到解决。 此外,不会抛出任何错误或异常。 任何有关解决&#39;何时&#39;在规范中承诺 - 以便控件进入指令的以下部分:
}).then(function (data) {
sF.data = data;
return $q.when(sF.res.fetchLinks('create'));
}).then(function (links) {
if (!links.length) {
return $q.when(sF.res.fetchLinks('edit'));
}
return links;
})