我正在尝试使用Jasmine验证具有ng-click指令的元素在单击时具有正确的行为。
<div ng-controller="FooController as $ctrl">
<a id="fooLink" ng-click="$ctrl.fooFunction()">
Call fooFunction!
</a>
</div>
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所做的调用。