アンダースコアのデバウンスを使用するサービスにメソッドがあります。
そのメソッド内には、別のサービスのメソッドへの呼び出しがあります。別のサービスが呼び出されることをテストしようとしています。
デバウンスされたメソッドをテストしようとすると、さまざまなサービスのメソッドが呼び出されることはなく、ジャスミンは次のように失敗します。
「スパイ aMethod が呼び出されることが予想されます。」
私はそれが呼び出されているという事実を知っています(クロムのコンソールにログを記録します)、期待がすでに失敗した後に呼び出されました。
したがって...(できれば)Sinonまたは別の依存関係を追加せず、
ボーナスポイント*をソリューションに与えると、_.debounceを$timeoutに変える必要はありません...
どうやって?
angular.module('derp', [])
.service('herp', function(){
return {
aMethod: function(){
console.log('called!');
return 'blown';
}
};
})
.service('Whoa', ['herp', function(herp){
function Whoa(){
var that = this;
this.mindStatus = 'meh';
this.getMind = _.debounce(function(){
that.mindStatus = herp.aMethod();
}, 300);
}
return Whoa;
}]);
テスト:
describe('Whoa', function(){
var $injector, whoa, herp;
beforeEach(function(){
module('derp');
inject(function(_$injector_){
var Whoa;
$injector = _$injector_;
Whoa = $injector.get('Whoa');
herp = $injector.get('herp');
whoa = new Whoa();
});
});
beforeEach(function(){
spyOn(herp, 'aMethod').andCallThrough();
});
it('has a method getMind, that calls herp.aMethod', function(){
whoa.getMind();
expect(herp.aMethod).toHaveBeenCalled();
});
});
なぜ AngularJS Testing の神々は私を見捨てたのですか?
* stackoverflow で実際にボーナス ポイントを付与する方法がわかりませんが、可能であれば付与します。