私はカルマ-ジャスミンで始めようとしています、そしてなぜこのテストが失敗するのかと思っています:
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;
}
addNew
とfakeFunction
は、次のようにして公開されます。
vm.addNew = addNew;
vm.fakeFunction = fakeFunction;
ただし、テストは次のように失敗します。
Expected spy fakeFunction to have been called.
テスト内から関数を呼び出すと、テストに合格することができます。私は期待していましたが、fakeFunction
が別の関数によって呼び出されたかどうかをテストできました。これを達成する適切な方法は何ですか?
更新:
//test.js
beforeEach(function() {
module("app");
inject(function(_$rootScope_, $controller) {
$scope = _$rootScope_.$new();
controller = $controller("CreateInvoiceController", {$scope: $scope});
});
});
私が次のようなものをテストした場合:
it('should say hello', function() {
expect(controller.message).toBe('Hello');
});
コントローラに次のものを入れれば、テストは合格です。
var vm = this;
vm.message = 'Hello';
パブリック関数が別の関数から呼び出されたかどうかをテストする方法を知りたいだけです。
addNew
メソッドがfakeFunction
を呼び出しています。ただし、これはcontroller.fakeFunction
を呼び出しているわけではありません。
これらの独立した関数ではなく、コントローラーを使用するようにコードを変更する必要があります。
[〜#〜] edit [〜#〜]:addNew
関数をスパイする必要もありません。これにより、関数がスパイに置き換えられます。もう1つの方法は、次のように変更することです。
spyOn(controller, 'addNew').and.callThrough()
私はこの問題を自分で見つけました。 @Vadimによる以前の回答には正しい原則がありますが、すべてが非常に明確だったとは思いません。私の場合、別の関数内からサービスのパブリック関数を呼び出そうとしています。関連するスニペットは次のとおりです。
サービス:
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();
});
ここで重要なのは、テストされている関数が、スパイされているパブリック関数と同じ参照を呼び出す必要があることです。