Как смоделировать функцию $ compile при тестировании фабрики с помощью Jasmine

0

Моя проблема очень похожа на этот пост, но достаточно разная, что принятый ответ не работает для меня. По сути, у меня есть Угловая фабрика, которая использует компиляцию $, которая возвращает обещание, и я хочу издеваться над ним в Жасмине. Вот упрощенная версия завода:

angular.module('app.common')
.factory('myFactory', myFactory);

myFactory.$inject = ['$compile', '$rootScope'];
function myFactory($compile, $rootScope) {
    var factory = {
        testFunc: testFunc
    }
    return factory;

    function testFunc(stuff) {
        angular.element(document.body).append($compile(stuff)($rootScope));
    }
}

И вот мой тест:

describe("Common", function() {
    // I have many common services
    beforeEach(function() {
        angular.mock.module('app.common');
    });

    describe("Factory Example: ", function() {
        var mockCompile, mockRoot, aFactory;

        beforeEach(function() {
            module(function($provide) {
                $provide.value('$compile', jasmine.createSpy('$compile'));
                $provide.value('$rootScope', jasmine.createSpy('$rootScope'));
            });
        });

        beforeEach(inject(function($compile, $rootScope, myFactory, $q) {
            mockCompile = $compile;
            mockCompile = function() {
                var deferred = $q.defer();
                deferred.resolve('remote call result');
                return deferred.promise;
            };
            mockRoot = $rootScope;
            aFactory = myFactory;
        }));

        it('should work', function() {

            aFactory.testFunc('stuff');
            expect(true).toBe(true);
        });
    });
});

Этот код жалуется на меня, что компиляция $ не возвращает обещание. Похоже, что $ provision не знает о назначении новой функции из инъекции. Я взломал его, но я новый для Жасмина, поэтому я не знаю, что я делаю. Любая помощь будет оценена - и если есть более простой способ сделать то, что я пытаюсь сделать, пожалуйста, дайте мне знать!

Теги:
jasmine

1 ответ

1
Лучший ответ

Хорошо, ура, я решил это!

Для тех, кто может быть заинтересован в будущем: первая проблема заключалась в том, что я неправильно предполагал, что компиляция $ возвращает обещание, а это не так. Он возвращает функцию, которая принимает область в качестве аргумента. Если вам нужно высмеять функцию, которая возвращает обещание, проверьте этот пост, который помог мне разобраться, как это сделать.

Конечно, это не сработало для меня, потому что все, что мне нужно было сделать, - это моя издеваемая функция компиляции. Следующий код работал для меня:

describe("Common", function() {
// I have many common services
beforeEach(function() {
    angular.mock.module('app.common');
});

describe("Factory Example: ", function() {
    var mockCompile, mockRoot, aFactory;

    beforeEach(function() {
        module(function($provide) {
            // Just use callFake to have $compile return a function
            $provide.value('$compile', jasmine.createSpy().and.callFake(function() {
                return function(scope) { scope(); };
            });
            $provide.value('$rootScope', jasmine.createSpy());
        });
    });

    beforeEach(inject(function($compile, $rootScope, myFactory, $q) {
        mockCompile = $compile;
        mockRoot = $rootScope;
        aFactory = myFactory;
    }));

    it('should work', function() {

        aFactory.testFunc('stuff');
        expect(mockCompile).toHaveBeenCalled();
        expect(mockRoot).toHaveBeenCalled();
    });
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню