Как я могу проверить, что функция debug.error () была вызвана в AngularJS? - PullRequest
1 голос
/ 08 октября 2019

У меня есть следующий код AngularJS:

<code>(function() {
    "use strict";

    /**
     * @ngdoc directive
     * @name beckon.flint.pageHeader:pageHeader
     * @scope
     * @section pageLayout
     *
     * @restrict E
     *
     * @description
     * A complete page header. The header transcludes additional content such as buttons into the header row.
     *
     * <h4>Source</h4>
     * <pre>
     * No controller setup needed.
     * 
* *

Шаблон

*
     * <page-header header="Available Dashboards" subheader="Reports">
     *      <flat-button ng-click="createSomething()" text="Create New Something"></flat-button>
     * </page-header>
     * 
* * @param {string} header - заголовок заголовка. * @param {string} subheader - заголовок подзаголовка. * @param {string} helpPage - ссылка на документацию * / angular .module ("beckon.flint.pageHeader", ["beckon.tinder.documentation.documentationLinks"]) .directive ("pageHeader", function () {return {templateUrl: "pageHeader", replace: true, transclude: true, scope: {header: "@", подзаголовок: "@", helpPage: "@", backState: "@?",}, ограничение: "E",controller: function ($ scope, documentsLinks, svg) {$ scope.icon = svg.ARROW_LEFT; const documentationLink = $ scope.helpPage? documentationLinks.helpPages [$ scope.helpPage]: null; if ($ scope.helpPage &&! documentsLink) {debug.error ("Указана неверная страница справки:" + $ scope.helpPage);} $ scope.helpUrl = documentsLink? documentationLink.url: null; $ scope.helpText = documentationLink? documentationLink.displayInfo.explanation: null;}, link: function ($ scope, $ element, attrs, controller, transcludeFn) {debug.log (transcludeFn);},};});}) ();

До сих пор я написал следующие тесты, и у него 90% покрытия кода:

fdescribe("pageHeader", () => {
    "use strict";

    let $scope;
    let $compile;
    let $rootScope;

    let svg;
    let documentationLinks;

    const getIsolatedScope = (element) => element.isolateScope() || element.scope();

    beforeEach(() => {
        module("beckon.flint.pageHeader");

        module(($provide) => {
            svg = jasmine.createSpy();
            documentationLinks = {
                helpPages: {
                    MyHelpPage: {
                        url: "dummypage.com",
                        displayInfo: {
                            explanation: "A dummy page",
                        },
                    },
                },
            };

            $provide.value("svg", svg);
            $provide.value("documentationLinks", documentationLinks);
        });

        inject((_$rootScope_, _$compile_) => {
            $compile = _$compile_;
            $rootScope = _$rootScope_;
            $scope = $rootScope.$new(true);
        });
    });

    it("should initialize correctly", () => {
        // Arrange
        const element = angular.element(
            "<page-header header='My header' subheader='My sub header' backState='My BackState'>Here goes the template</page-header>"
        );

        // Act
        $compile(element)($scope);
        $scope.$digest();
        const isolatedScope = getIsolatedScope(element);
        isolatedScope.helpPage = {};
        spyOn(debug, "error");

        // Assert
        expect(isolatedScope.helpUrl).toBe(null);
        expect(isolatedScope.helpText).toBe(null);
        expect(debug.error).toHaveBeenCalled();
    });
});

Это условие:

if ($scope.helpPage && !documentationLink) {
    debug.error("Invalid help-page specified:" + $scope.helpPage);
}

, кажется,единственная непроверенная часть кода, и я не могу этого достичь. Я пробовал spyOn(debug,"error") и expect(debug.error).toHaveBeenCalled();, как показано во втором фрагменте, но этот конкретный тест не пройден.

Есть ли способ проверить, что эта конкретная функция debug.error работает правильно, без изменения основного кода?

...