承诺在使用jasmine测试指令时不会得到解决

时间:2014-06-03 16:41:13

标签: angularjs jasmine promise when-js

我目前正在测试使用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;
                }) 

0 个答案:

没有答案