2015-01-07 10 views
8

私はカルマ-ジャスミンを始めるためにしようとしていると、このテストが失敗した理由を、私は思ったんだけど:AngularJS - 別の関数内から関数が呼び出されたかどうかをテストする方法は?

私は以前、私は、次のしているこのテスト用に設定した私のコントローラで
it("should call fakeFunction", function() { 
    spyOn(controller, 'addNew'); 
    spyOn(controller, 'fakeFunction'); 
    controller.addNew(); 
    expect(controller.fakeFunction).toHaveBeenCalled(); 
}); 

function addNew() { 
    fakeFunction(3); 
} 

function fakeFunction(number) { 
    return number; 
} 

両方addNewfakeFunction使用して露出している:

vm.addNew = addNew; 
vm.fakeFunction = fakeFunction; 

試験ただし、次で失敗:

Expected spy fakeFunction to have been called.

私は私のテストの中から関数を呼び出す場合、私はテストパスを作ることができます。しかし、私はfakeFunctionが別の関数によって呼び出されたかどうかをテストすることができました。これを達成するための適切な方法は何ですか?

アップデート:私はちょうど知りたい

var vm = this; 
vm.message = 'Hello'; 

:私は私のコントローラで次置けばテストに合格

it('should say hello', function() { 
    expect(controller.message).toBe('Hello'); 
}); 

//test.js 

beforeEach(function() { 

    module("app"); 

    inject(function(_$rootScope_, $controller) { 

     $scope = _$rootScope_.$new(); 
     controller = $controller("CreateInvoiceController", {$scope: $scope}); 

    }); 

}); 

は、私のようなものをテストする場合パブリック関数が別の関数から呼び出されたかどうかをテストする方法。

答えて

8

addNewメソッドはfakeFunctionを呼び出しています。しかし、それはあなたの期待であるcontroller.fakeFunctionを呼び出していません。

これらの独立した機能ではなく、コントローラを使用するようにコードを変更する必要があります。

EDIT:また、addNew機能をスパイする必要はありません。これにより、機能がスパイに置き換えられています。もう1つの方法は、次のように変更することです。

spyOn(controller, 'addNew').and.callThrough() 
+0

私は 'vm.fakeFunction'を呼び出そうとしましたが、どちらも動作しません。どのように正確に行われますか? –

+0

@RaphaelRafatpanah '' vm'が何であるか分かりませんが、それはあなたがテストしているものではありません。あなたは 'controller.fakeFunction'が呼び出されたことをテストしています – Vadim

+0

わかりません。 'vm'は角型コントローラで' this'をキャプチャするための一般的な変数です。実際には、 'vm'と' controller'はどちらも 'this'を参照するべきです。 –

7

私はこの問題を自分自身に直しました。 @ Vadimによる以前の回答には正しい原則がありますが、私はすべてが非常に明確だとは思いません。私の場合は、別の関数内からサービス上のpublic関数を呼び出そうとしています。ここでは、関連するスニペットは、以下のとおりです。

サービス:

angular.module('myApp').factory('myService', function() { 
 

 
    function doSomething() { 
 
     service.publicMethod(); 
 
    } 
 

 
    function publicMethod(){ 
 
     // Do stuff 
 
    } 
 

 
    var service = { 
 
     publicMethod: publicMethod 
 
    }; 
 

 
    return service; 
 
});

テスト:

it('calls the public method when doing something', function(){ 
 
    spyOn(service, 'publicMethod'); 
 

 
    // Run stuff to trigger doSomething() 
 

 
    expect(service.publicMethod).toHaveBeenCalled(); 
 
});

ここで重要なのはfunctioということですテストされているnは、スパイされている公開関数と同じ参照を呼び出す必要があります。

関連する問題