ディレクティブをモックするクリーンな方法は$compileProvider
beforeEach(module('plunker', function($compileProvider){
$compileProvider.directive('d1', function(){
var def = {
priority: 100,
terminal: true,
restrict:'EAC',
template:'<div class="mock">this is a mock</div>',
};
return def;
});
}));
モックがモックしているディレクティブよりも高い優先度を取得し、モックがターミナルであることを確認して、元のディレクティブがコンパイルされないようにする必要があります。
priority: 100,
terminal: true,
結果は次のようになります。
このディレクティブが与えられた場合:
var app = angular.module('plunker', []);
app.directive('d1', function(){
var def = {
restrict: 'E',
template:'<div class="d1"> d1 </div>'
}
return def;
});
次のようにモックできます。
describe('testing with a mock', function() {
var $scope = null;
var el = null;
beforeEach(module('plunker', function($compileProvider){
$compileProvider.directive('d1', function(){
var def = {
priority: 9999,
terminal: true,
restrict:'EAC',
template:'<div class="mock">this is a mock</div>',
};
return def;
});
}));
beforeEach(inject(function($rootScope, $compile) {
$scope = $rootScope.$new();
el = $compile('<div><d1></div>')($scope);
}));
it('should contain mocked element', function() {
expect(el.find('.mock').length).toBe(1);
});
});
さらにいくつかのこと:
replace:true
モックを作成するときは、 and/orが必要かどうかを検討する必要がありますtemplate
。たとえばng-src
、バックエンドへの呼び出しを防ぐためにモックする場合replace:true
は、template
. しかし、視覚的なものをモックする場合は、そうしたいかもしれません。
100 を超える優先順位を設定すると、モックの属性は補間されません。$compile ソース コードを参照してください。たとえば、モックng-src
して を設定priority:101
すると、最終的にモックでng-src="{{variable}}"
はありませんng-src="interpolated-value"
。
これがすべてのプランカーです。正しい方向に向けてくれた@trodriguesに感謝します。
詳細を説明するドキュメントを次に示します。「構成ブロック」セクションを確認してください。@ebelanger に感謝!