web-dev-qa-db-ja.com

AngularJSで$ scope。$ onをテストする方法

ブロードキャスト後にスコープが設定されていることをテストするにはどうすればよいですか?私は検索していくつかの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'}]);

});

結石

21
stonerichnau

スパイに実際の$ broadcast関数を呼び出させるには、Jasmineに指示する必要があります

_spyOn($rootScope, '$broadcast').andCallThrough();
_

andCallThrough()を使用しない場合、スパイは何もしません。

Jasmine Docs

[〜#〜]編集[〜#〜]

Jasmine 2では、構文は次のようになります。

_spyOn($rootScope, '$broadcast').and.callThrough();
_
36
ivarni

toHavebeenCalledに関する限り、「andCallThrough()」は必要ありません。単純なスパイでうまくいきます。あなたの場合、あなたの引数は異なります。

次のようにブロードキャストしています:rootScope。$ broadcast('updatecrappy'、[{id:2、name: 'crappy'}]);

しかし、あなたは期待しています:

expect(rootScope。$ broadcast).toHaveBeenCalledWith('updscenes'、[{id:2、name: 'crappy'}]);

引数 "pdarecrappy"を見てくださいが、tohavebeencalledでは "pdscenes"です。

0
vipul patel

以下のサンプルコードを見てください。私にとってはうまくいきます。

$ 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'をスパイしなかったことに注意してください。

0
rach8garg

$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');
0
KATHERINE