0

私たちはサービスの単体テストを行っており、依存サービスの引数を持つメソッドをスパイするという問題に直面しています。

ServiceA の単体テストを作成しています

ServiceA.js

angular.module("App").service("ServiceA", function($http, ServiceB) {
    this.detail = null; 
    this.method = function(id){
        var sevrB = new ServiceB();
        return sevrB.getId(1).then(function(response) {
            this.detail = response.data;
        }); 
    };
 });

ServiceB.js (ファクトリーです)

(function () {
    var dependencies = [
      '../module'
    ];
    define(dependencies, function (module) {
        return module.factory('ServiceB', function ($http) {
            var ServiceB= function () {
                this.id = null;               
            };

        ServiceB.prototype.getId = function(Id) {                               
            return $http.get('/test/');
        }
    }
 }());

単体テスト コード

 describe('Testing ServiceA', function () {
 var serviceA, serviceBMock;

 beforeEach(function () {
     var _serviceBMock = function () {
         return {
             getId:function(id){
                 return 'test';
             }
         };
     };

     angular.module('ServiceAMocks', [])                   
         .value('ServiceB', _serviceBMock);
 });

beforeEach(module('ServiceAMocks'));       

beforeEach(inject(function (_ServiceA_, _ServiceB_) {
    serviceA=_ServiceA_;
    serviceBMock=_ServiceB_;
});

it('retrive Id', function () {  
   spyOn(serviceBMock,'getId').and.Return('test');
   serviceA.method(1);
});

}); 

ServiceA から ServiceB の getId メソッドをスパイしています。 ServiceB を関数としてモックした場合、以下のエラーが発生します

エラー: jasmineInterface.spyOn に getId() メソッドが存在しません

serviceB をオブジェクトとしてモックすると、エラーが発生します

 TypeError: object is not a function

 var _serviceBMock = {              
     getId:function(id){
         return 'test';
     }
 }

そして、このシナリオで約束をテストするかどうかはわかりません。

4

1 に答える 1

0

このバージョンは Jasmine 1.3 をサポートしています

ServiceBがメソッドを呼び出したいので、$qサービスを注入しています。先に進んで返された promise を解決することもできますが、これはテストの次のステップです。

AngularJS がserviceBのインスタンスを挿入する以前のバージョンの質問への回答

describe('ServiceA', function () {
    var serviceA, ServiceB, $q;

    beforeEach(function () {
        module('App');
    });

    beforeEach(function () {
        module(function ($provide) {
            $provide.value('ServiceB', {
                getId: jasmine.createSpy('ServiceB.getId').andCallFake(function () {
                    return $q.all();
                })
            });
        });
    });

    beforeEach(inject(function (_ServiceA_, _ServiceB_, _$q_) {
        $q = _$q_;
        serviceA = _ServiceA_;
        ServiceB = _ServiceB_;
    }));

    describe('.method()', function () {
        it('returns ServiceB.getId() argument', function () {
            serviceA.method(1);
            expect(ServiceB.getId).toHaveBeenCalledWith(1);
        });
    });
});

jsfiddle: http://jsfiddle.net/krzysztof_safjanowski/sDh35/

于 2014-08-03T23:45:06.040 に答える