私は別の場所からいくつかのDOMを変更するためのコントローラを持っています。コントローラを別にテストするには?
コントローラは次のとおりです。
angular.module('myModule').controller('myController', myController);
function myController() {
this.addSomeClass = function() {
$('#idOfSomeElement').addClass('someClass');
};
}
、それは次のように使用されています。異なるコンポーネントとhtml内。
<div id="idOfSomeElement"></div>
.
.
.
<some-angular-component-here>
<div ng-controller="myController as ctrl">
<div ng-click="ctrl.addSomeClass()"></div>
</div>
</some-angular-component-here>
.
.
.
<using-in-onother-place>
<div ng-controller="myController as ctrl">
<div ng-click="ctrl.addSomeClass()"></div>
</div>
</using-in-onother-place>
私はこのようにテストしようとしますが、私は未定義のctrlを持っています。
describe('Controller test', function() {
'use strict';
var ctrl,
element;
beforeEach(inject(function ($rootScope, $compile) {
var scope = $rootScope.$new();
angular.element('<div id="idOfSomeElement"></div>' +
'<div ng-controller="myController as ctrl">' +
'<div id="button" ng-click="ctrl.addSomeClass()"></div>' +
'</div>');
element = $compile(element)(scope);
scope.$apply();
// how to get controller here with linked to html?
ctrl = $controller('myController');
ctrl = element.controller('myController');
}));
it('should add some class', function() {
var button = $(element).find('#button')[0];
$(button).trigger('click');
var someElement = $(element).find('#idOfSomeElement')[0];
expect(someElement).toHaveSomeClass();
});
});
この種類のコントローラをテストするにはどうすればよいですか? そして、私はコントローラ内のDOMを操作することが悪いことを知っていますが、私はそれをユニットテストする必要があります。私はあなたがあなたの要素のプロパティにangular.elementの戻り値を代入するのを忘れたと思います
おかげ
DOM器具のテストであります'$( '#idOfSomeElement')'セレクタはフィクスチャに届きません。あなたの最善の策は '$(...)'を模倣することです(jQueryの 'init'メソッドをスタブすることで可能性があります。これは[ここ](http://stackoverflow.com/a/36356692/3731501) )と 'addClass'メソッドを呼び出し、呼び出しを偵察します。これはjQueryとAngularを混在させる理由の1つです。そしてはい、これはコントローラーで行うべきではありません。 – estus