2016-02-03 11 views
9

私は角度のあるMeteorJSを使用していて、コントローラをテストしたいと思います。私のコントローラは$ reactive(this).attach($ scope)を使います。このメソッドが呼び出されたかどうかを確認する必要があります。Jasmine spyOn on関数と返されたオブジェクト

私はスパイのためにそのようなものを作成します。

var $reactive = function(ctrl) { 
    return { 
     attach:function(scope) {} 
    } 
}; 

だから私はそのようにそれを呼び出すことができます。

$reactive('aaa').attach('bbb'); 

私はテストでそれを行うことができますどのように?

spyOn($reactive, 'attach'); 

動作しません。私はエラー:attach()メソッドが存在しません

それが呼び出されたかどうかをチェックするには? これはいいですか?

expect($reactive).toHaveBeenCalledWith(controller); 

そして、関数attachがargs(scope)で呼び出されたことを確認する方法はありますか?

+0

は、右の添付方法を、含まれているオブジェクトを返しますreactive' '$のように見えますか?そして、この 'attach'メソッドが呼び出されたことをテストしたいとします。 – Raulucco

+0

@Rauluccoまさに – psalkowski

答えて

4

$reactiveコンポーネントをモックする必要があります。テストの範囲内でspyObjを返すスパイと交換してください。その後、$reactiveメソッドを実行してテストする方法を実行します。

var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']); 
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult); 
var controller = {}; 
    beforeEach(function() { 
     module(function ($provide) { 
     $provide.factory('$reactive', $reactive); 
     }); 
     module('yourAppModule'); 
    }); 

it('Should call attach', function() { 
    $reactive(controller).attach(); 
    expect($reactive).toHaveBeenCalledWith(controller); 
    expect(reactiveResult.attach).toHaveBeenCalled(); 
}) ; 

あなたも、コントローラの依存関係に$reactiveスパイ提供することができます:

var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']); 
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult); 
var ctrl; 
    beforeEach(inject(function ($controller) { 
     ctrl = $controller('YourController', {$reactive: $reactive }); 
    })); 

it('Should call attach', function() { 
    //ctrl.triggerThe$reactiveCall 
    expect($reactive).toHaveBeenCalledWith(ctrl); 
    expect(reactiveResult.attach).toHaveBeenCalled(); 
}) ; 
+0

ありがとう!今私はテストについてもっと知っています。 – psalkowski

関連する問題