4

我有一个模拟资源,它只是一个函数对象,在这种情况下只有一个。该函数返回另一个函数。代码如下所示:

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

我可以监视 tenantOptions() ,spyOn(RevivhalResource, 'tenantOptions');但我似乎无法监视post()tenantOptions()回报。

唯一不会引发错误的是 spyOn(RevivhalResource.tenantOptions(), 'post');,但我相信我只是在 post 函数的新实例上设置间谍,但是当角度应用程序调用RevivhalResource.tenantOptions().post();它时,它正在调用 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 回答