4

単に関数のオブジェクトであるモック化されたリソースがあります。この場合は 1 つだけです。この関数は別の関数を返します。コードは次のようになります。

var mockRevivhalResource = {
    tenantOptions: function tenantOptions() {
        return {
            post: function post() {
            }
        }
    }
};
var RevivhalResource = mockRevivhalResource;

tenantOptions() をスパイすることはできますが、そのリターン spyOn(RevivhalResource, 'tenantOptions');をスパイすることはできません。post()tenantOptions()

エラーをスローしない唯一のことは spyOn(RevivhalResource.tenantOptions(), 'post');、投稿関数の新しいインスタンスにスパイを設定しているだけだと思いますが、角度のあるアプリケーションが呼び出すと、投稿RevivhalResource.tenantOptions().post();の新しいインスタンスが呼び出されます。console.log("test");スパイにコールスルーさせなくても、テストは「テスト」を出力します。しかし、私はその点で間違っている可能性があります。

リソースを呼び出しているコントローラ コードは次のようになります。

$scope.fun = function fun() {
    RevivhalResource.tenantOptions().post(
        {...stuff...},
        function success(data) {...success handler...},
        function error(data) {...error handler...}
    )
};

RevivhalResource はこのような angularjs プロバイダーです

angular.module('revivhal').provider('RevivhalResource', [function () {
    ...init stuff...
    this.$get = function ($resource) {
        ...more init stuff...
        return {
            tenantOptions: function tenantOptions() {
                return $resource(...path..., {...data...}, 
                                 post: {method: "POST"});
            }
        }
    }
}]);

そして、私がやろうとしているのは、スパイを使用して RevivhalResource.tenantOptions().post() が呼び出されたことを確認することです。次に、スパイに成功ハンドラーとエラー ハンドラーを呼び出して、ハンドラーが正しいことをテストする必要があります。

4

1 に答える 1

5

モックをリファクタリングして、他のスパイを返すスパイから構築することができます。

var postSpy = jasmine.createSpy();
var tenantOptionsSpy = jasmine.createSpy()
var mockRevivhalResource = {
    tenantOptions: tenantOptionsSpy.andReturn({post: postSpy})
};

mockRevivhalResource.tenantOptions().post()
expect(tenantOptionsSpy).toHaveBeenCalled();
expect(postSpy).toHaveBeenCalled();
于 2013-08-01T11:51:00.153 に答える