2013-10-18 17 views
20

ブロードキャスト後にスコープに値が入力されたことをどのようにテストしますか?私は検索して、いくつかのQAをここでstackexchangeで見つけましたが、誰も私の問題に答えませんでした。コードは問題なく動作していますが、テストする方法はわかりません。私はテストの初心者、特にジャスミンと付け加えることができます。

だから、ここのコードです:

サービス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'}]); 

});

あなたはスパイが何もしないandCallThrough()を使用しない場合はスパイが

spyOn($rootScope, '$broadcast').andCallThrough(); 

実際の$放送関数を呼び出すようにするジャスミンを指示する必要がありストーン

+0

私はこれも参考になりました:http://stackoverflow.com/questions/15272414/how-can-i-test-events-in-angular – Ben

答えて

36

。ジャスミン2で

Jasmine Docs

EDIT

あなたはこれらの2つの場合のような何かを行うことができます$scope.$broadcast()から偽returnValueにしたい場合は、構文は

spyOn($rootScope, '$broadcast').and.callThrough(); 
+0

これが実際に何をしているのか詳しく調べることができますか? – iamwhitebox

+0

@whiteboxそれは事であり、それほど大したことではありません。デフォルトでは、ジャスミンのスパイはスパイされている元の機能を置き換えます。 'and.callThrough()'を呼び出すと、デフォルトの動作に追加され、スパイにスパイされていた元の関数を呼び出します。そして、それは本当にすべてです。 – ivarni

+0

ブロードキャストが呼び出されたばかりの場合には、and.callThrough()は必要ありません –

0

次のようになります。

ケース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

に関する限り "をtoHavebeenCalled" として、 "andCallThrough()" の必要はありません。シンプルなスパイが動作します。あなたの場合、あなたの議論は異なっています。あなたが好きな放送さ

、 rootScope $放送('updatecrappy'、[{ID:2、名称: 'くだらない'}])。

は、しかし、あなたが期待する:

期待(rootScope $放送。).toHaveBeenCalledWith('updscenes'、[{ID:2、名称: '安っぽいです'}]);引数 "updarecrappy" で、それは "updscenes" であるtohavebeencalledで

表情。

0

以下のサンプルコードを見ると、うまく動作します。

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

関連する問題