2013-04-15 5 views
7

私はしばらくの間サービスをテストしようとしていて、助けを求めていました。ここに私の状況は次のとおりです。AngularJSインジェクションサービスの模擬内部テスト

私は少しこのよう

myModule.factory('myService', ['$rootScope', '$routeParams', '$location', function($rootScope, $routeParams, $location) { 

    var mySvc = { 
    params: {} 
    } 

    // Listen to route changes. 
    $rootScope.$on('$routeUpdate', mySvc.updateHandler); 

    // Update @params when route changes 
    mySvc.updateHandler = function(){ ... }; 

    ... 
    ... 

    return mySvc; 

}]); 

を探してサービスを持っていると私は私がテストできるようにサービスが私のテストに注入される前'myService'に注入されたサービスをモックとしたいです私はテストとモックのためにジャスミンを使用しています

var mySvc = { 
    params: {} 
    } 

    // Listen to route changes. 
    $rootScope.$on('$routeUpdate', mySvc.updateHandler); 

の下 初期化コード。これは私が今までに思いついたものです

describe('myService', function(){ 
    var rootScope, target; 
    beforeEach(function(){ 
    rootScope = jasmine.createSpyObj('rootScope', ['$on']); 

    module('myModule'); 
    angular.module('Mocks', []).service('$rootScope', rootScope); 
    inject(function(myService){ 
     target = myService; 
    });   
    }); 

    it('should be defined', function(){ 
    expect(target).toBeDefined(); 
    }); 

    it('should have an empty list of params', function(){ 
    expect(target.params).toEqual({}); 
    }); 

    it('should have called rootScope.$on', function(){ 
    expect(rootScope.$on).toHaveBeenCalled(); 
    }); 
}); 

これはうまくいきません。私のルートスコープモックは元のものに取って代わるものではなく、Dependency Injectionのドキュメントは何よりも私を混乱させています。

私が代わりに独自のカスタムオブジェクトを挿入しようとしているの実際の$ rootScopeをスパイだろう

答えて

7

を助けてください。

これはCoffeScriptでテストしましたが、上記のコードは引き続き動作するはずです。

+0

ありがとうございます!魅力のように働いた。私は前にそれを試していないとは信じられません。 –

+0

spyOn(rootScope、 "$ on")を spyOn(rootScope、 "$ on")に変更し、andCallThrough();を追加する必要がありました。 でも素晴らしい仕事をして、正しい方向に向かいました。 – blackmind

0

あなたはRootControllerを作成し、それを注入できます。

inject(function(myService, $controller){ 
    target = myService; 
    $controller('rootController', { 
     $scope : $rootScope.$new(), 
     $rootScope : myService 
    }); 
}); 

この方法を使えば、あなたの「myServiceという」からの$ rootScope機能にアクセスすることができます。 そのような 'myService。$ on()'

私はちょうどそれを作った、助けが必要かどうか私に教えてください。

関連する問題