У меня есть следующий код 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 работает правильно, без изменения основного кода?