ブロードキャスト後にスコープが設定されていることをテストするにはどうすればよいですか?私は検索していくつかのQAをここでstackexchangeに見つけましたが、誰も私の問題に答えていません。コードは問題なく動作していますが、テストする方法がわかりません。私はテストの初心者であり、特にJasmineを使用していることを付け加えてください。
だから、これがコードです:
サービスCrappySvc:
update: function() {
$rootScope.$broadcast('updatecrappy', Crappy.query());
}
コントローラGetCrappyCtrl:
$scope.$on('updatecrappy', function(event, crap) {
$scope.crap = crap;
});
ジャスミン:
beforeEach(inject(function($rootScope, $httpBackend, $controller, Crappy) {
rootScope = $rootScope;
scope = $rootScope.$new();
Crappy = mockCrappy;
...
spyOn(rootScope, '$broadcast');
...
ctrl = $controller('GetCrappyCtrl', {
$scope : scope,
Crappy : mockCrappy
});
}));
it('$scope.$on should have been triggered', function() {
rootScope.$broadcast('updatecrappy', [{id : 2, name : 'crappy'}]);
expect(rootScope.$broadcast).toHaveBeenCalledWith('updscenes', [{id : 2, name : 'crappy'}]);
});
結石
スパイに実際の$ broadcast関数を呼び出させるには、Jasmineに指示する必要があります
_spyOn($rootScope, '$broadcast').andCallThrough();
_
andCallThrough()
を使用しない場合、スパイは何もしません。
[〜#〜]編集[〜#〜]
Jasmine 2では、構文は次のようになります。
_spyOn($rootScope, '$broadcast').and.callThrough();
_
「toHavebeenCalledに関する限り、「andCallThrough()」は必要ありません。単純なスパイでうまくいきます。あなたの場合、あなたの引数は異なります。
次のようにブロードキャストしています:rootScope。$ broadcast('updatecrappy'、[{id:2、name: 'crappy'}]);
しかし、あなたは期待しています:
expect(rootScope。$ broadcast).toHaveBeenCalledWith('updscenes'、[{id:2、name: 'crappy'}]);
引数 "pdarecrappy"を見てくださいが、tohavebeencalledでは "pdscenes"です。
以下のサンプルコードを見てください。私にとってはうまくいきます。
$ rootScopeからサンプルイベント 'onTimeChanged'を発行しています。私のコントローラーにはリスナー 'onTimeChanged'があり、その中でtimeChanged()メソッドを呼び出しています。
describe('onTimeChanged()', function() {
it('should call another method or controller', function() {
spyOn(searchCtrl, 'timeChanged');
$rootScope.$emit('onTimeChanged');
expect(searchCtrl.timeChanged).toHaveBeenCalled();
});
});
RootScopeのメソッド '$ emit'をスパイしなかったことに注意してください。
$scope.$broadcast()
からreturnValue
を偽装したい場合は、次の2つのケースのようにすることができます。
ケース1:
scope.$broadcast('TEST_CHANGED', {test: 'test1'});
spyOn(scope, '$broadcast').and.callThrough();
expect(something).toEqual('something');
ケース2:
scope.$broadcast('TEST_CHANGED', {test: 'test2'});
spyOn(scope, '$broadcast').and.callThrough();
expect(something2).toEqual('something2');