如何模拟ngModel?

时间:2013-07-31 17:33:44

标签: angularjs jasmine

所以我正在测试一个控制器,它引用了DOM中指定为ngModel的属性。 但是当我测试我的控制器时,我没有模板。 因此,只要在控制器中访问$ scope.foo.property,就会抛出错误。

2 个答案:

答案 0 :(得分:1)

在测试中,您可以在实例化控制器之前定义属性:

it('should mock ng-model', inject(function($rootScope, $controller) {

    $rootScope.foo = {
        property: 'mock value'
    };

    $controller('myController', {$scope: $rootScope});
})));

答案 1 :(得分:0)

控制器和视图(模板)是Angular应用程序中的两个独立的东西。将它们粘合在一起的是范围(或模型)。因此,要测试控制器,您需要的只是一个伪作用域传递给控制器​​函数。

这是一个使用全局控制器的简单示例(只是为了让事情更容易理解 - 不要在生产代码中使用全局控制器)和伪测试函数:

function MyCtrl($scope) {
    $scope.bar = $scope.foo.property + 1;
}

function test() {
    var scope = { foo: { property: 1 }};
    MyCtrl(scope);
    expect(scope.bar).toBe(2);  
}

比在模块中定义控制器时要复杂一点,但这是另一个故事。