質問: Jasmine Unit Test ができるように pointFactory を偽造するにはどうすればよいですか。
次のディレクティブがあります。html がファクトリに送信され、いくつかのロジックに応答が使用されます。
CommonDirectives.directive('TextEnrichment',['PointFactory','appSettings', function (pointFactory,settings) {
return {
restrict: 'A',
link : function (scope, element, attrs) {
var text = element.html();
pointFactory.getPoints(text).then(function(response){
})}}}]);
これまでのところ、単体テストは次のようになっていますが、ファクトリを注入していないため機能しません。
beforeEach(module('app.common.directives'));
beforeEach(function () {
fakeFactory = {
getPoints: function () {
deferred = q.defer();
deferred.resolve({data:
[{"Text":"Some text"}]
});
return deferred.promise;
}
};
getPointsSpy = spyOn(fakeFactory, 'getPoints')
getPointsSpy.andCallThrough();
});
beforeEach(inject(function(_$compile_, _$rootScope_,_$controller_){
$compile = _$compile_;
$rootScope = _$rootScope_;
}));
it('Factory to have been Called', function () {
var element = $compile('<div data-text-enrichment=""> Text </div>')($rootScope)
expect(getPointsSpy.callCount).toBe('1');
});
アップデート
Felipe Skinner からのアドバイスに従って、次のようにテストを更新しました。
beforeEach(function(){
module(function($provide){
$provide.factory('PointFactory',getPointsSpy)
})
});
ただし、次のエラーが表示されます。
TypeError: 'undefined' は関数ではありません ('pointFactory.getPoints(text)' を評価しています)