如何测试在同一元素上使用ngModel的指令

时间:2015-12-29 06:46:00

标签: angularjs unit-testing angularjs-directive jasmine angularjs-controller

我有一个需要ngModel的指令。在其链接函数中,它在ngModel控制器上调用$ setViewValue。我想测试在正确的条件下调用$ setViewValue,但我无法解决如何添加我的间谍...

这是我的简化代码:

指令

angular.module("myApp").directive("myDir", function()
{
    return {
        restrict: "A",
        require: ["ngModel"],
        link: function(scope, element, attrs, ctrls)
        {
            var ngModel = ctrls[0];

            ......

            function changeHandler(event) {
                ngModel.$setViewValue(ckeditor.getData());
            }
        }
    };
});

HTML:

<textarea my-dir ng-model="myData"></textarea>

我希望我的测试类似于:

describe("updating text in ckeditor", function() {
        it("should update model value", function() {
                $compile("<textarea my-dir ng-model='text'></textarea>")(scope);
                spyOn(ngModel, "$setViewValue");
                // trigger change handler
                expect(ngModel.$setViewValue).toHaveBeenCalled();
        });
});

谢谢!

1 个答案:

答案 0 :(得分:0)

我无法真正找到如何在链接功能中模拟ngModel,但我找到了一种替代方法,我可以测试它,无论如何都要好得多,如果有帮助的话,我会发布。

因此,我只是测试传入的属性上的值已经更改为ngModel的值,而不是窥探$ setViewValue函数。看起来非常明显。

无论如何,这是我的测试

describe("updating text in ckeditor", function() {
        it("should update model value", function() {
                scope = $rootScope.$new();
                scope.text = "";
                $compile("<textarea my-dir ng-model='text'></textarea>")(scope);

                spyOn(ckeditorInstance, "getData").and.returnValue("updated text");
                // trigger change handler...

                expect(scope.text).toEqual("updated text");
        });
});