使用jasmine.spyOn验证ng-click行为

时间:2017-03-08 17:37:57

标签: angularjs typescript jasmine

我正在尝试使用Jasmine验证具有ng-click指令的元素在单击时具有正确的行为。

view.html

<div ng-controller="FooController as $ctrl">
    <a id="fooLink" ng-click="$ctrl.fooFunction()">
         Call fooFunction!
    </a>
</div>

foo.tests.ts

describe("the view", () => {
        let viewElement: JQuery;
        let ctrl: FooController;

        beforeEach(() => {
            ctrl = $controller('FooController', { '$scope': $scope });

            let viewHtml = $.ajax('view.html', { async: false }).responseText;

            viewElement = $(viewHtml);
            $compile(viewElement)(ctrl.$scope);
        });

        it("should call fooFunction() when clicked", () => {
            spyOn(ctrl, "fooFunction");
            link = viewElement.find("#fooLink");
            link.click();
            expect(ctrl.fooFunction).toHaveBeenCalled(); //FAILS :(
        }
    }

测试失败,Expected spy fooFunction to have been called.。我已经通过调试和其他测试验证了点击时fooFunction 被调用,所以问题似乎是$scope.fooFunction$ctrl.fooFunction不一样功能。此外,调试显示fooFunction执行即使它应该被间谍覆盖。如何编写此测试,以便Jasmine正确跟踪从ng-click表达式对控制器函数的调用?

更新:我尝试使用$controllerProvider(请参阅this question)向视图提供间谍对象,但结果相同。调试显示控制器确实在所需的函数名称上有一个间谍;它只是不跟踪ng-click所做的调用。

0 个答案:

没有答案