2013-07-31 12 views
1

Итак, я тестирую контроллер, который ссылается на свойство, указанное как ngModel в DOM. Но пока я тестирую свой контроллер, у меня нет шаблона. Таким образом, всякий раз, когда $ scope.foo.property обращается к контроллеру, он выдает ошибку.Как издеваться над ngModel?

+0

Можете ли вы предоставить макет шаблона? –

+0

Макет шаблона, ну, я тестирую контроллер, зачем мне нужен шаблон макета? В учебниках говорится: «В угловых контроллерах строго отделены от DOM» –

+0

Действительно. Что вызывает вопрос, зачем вам шаблон? –

ответ

1

В тесте, вы можете определить свойство перед экземпляр контроллера:

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

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

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

Это foo.property имеет тип NgModelController, не уверен, как создать экземпляр или сделать это. –

+0

Вы хотите проверить свой контроллер и его взаимодействия с этим свойством, а не с ngModelController? –

+0

Это то, что я сделал, скажем, например, у меня есть экземпляр ngModelConroller, который передается в контроллер, поэтому я бы высмеивал экземпляр ngModelController, а издевавшиеся методы сказали $ setValidity и ввели его в область действия и передали его по контроллеру. Таким образом, я могу проверить, был вызван метод $ setValidity, если мой функциональный spec завершает это. –

0

контроллеры и виды (шаблоны) являются две отдельные вещи в угловых приложениях. Что их склеивает, это область (или модель). Таким образом, для тестирования контроллера все, что вам нужно, - это поддельная область действия, чтобы перейти к функции контроллера.

Вот очень простой пример использования глобального контроллера (только, чтобы держать вещи легче понять - не использовать глобальные контроллеры в рабочем коде) и тестовое псевдо функции:

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

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

Он получает немного сложнее, чем когда контроллер определен в модуле, но это еще одна история.