监视另一个函数返回的函数

时间:2013-08-01 11:36:24

标签: angularjs jasmine

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

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

我可以使用spyOn(RevivhalResource, 'tenantOptions');监视tenantOptions(),但我似乎无法监视post() tenantOptions()返回的内容。

唯一没有抛出错误的是spyOn(RevivhalResource.tenantOptions(), 'post');,但我相信我只是在post函数上设置一个新实例的间谍,但是当角度应用程序调用{​​{1}}时它正在调用一个新的帖子实例,因为如果我在模拟的post函数中有RevivhalResource.tenantOptions().post();,那么即使我不让间谍callThrough,测试也会打印出“test”。但在这件事上我可能是错的。

调用资源的控制器代码就像这样

console.log("test");

RevivhalResource是像这样的angularjs提供者

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

我正在尝试做的是使用间谍来确认已经调用了RevivhalResource.tenantOptions()。post()。然后我需要让间谍调用成功和错误处理程序来测试处理程序是否正确。

1 个答案:

答案 0 :(得分:4)

你可以重构你的模拟,以便它的构建可以从其他间谍那里找回间谍:

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

mockRevivhalResource.tenantOptions().post()
expect(tenantOptionsSpy).toHaveBeenCalled();
expect(postSpy).toHaveBeenCalled();