Jasmine如何测试返回匿名函数的函数

时间:2017-02-07 15:58:29

标签: angularjs unit-testing jasmine karma-jasmine

我在服务中有以下代码。

function getK(k) {
        return function() {
            return k;
        };
    }

我可以测试使用

调用getK
beforeEach(inject(function(FiltersService){
    this.service = FiltersService;
    spyOn(this.service, 'getK');
}));

it("getK should be called", function(){
    var key = "TEST";
    var result = this.service.getK(key);
    expect(this.service.getK).toHaveBeenCalled();
    expect(this.service.getK).toHaveBeenCalledWith("TEST");
}

我的问题是如何测试内部

return function() {
    return k;
}

使用Jasmine

修改

要尝试进一步指定,getK function用于填写对象,如下所示。该对象是我正在使用的key库的一部分。我想我有点困惑如何从业力茉莉的角度测试这个,看到key的实际实现是我无法控制的库的一部分。所以我不确定如何为内部getK函数编写测试,甚至不知道如何为下面的valid函数编写测试以确保对象已正确填写

libObject.push({
   Data: {
   Name: 'test'  
            },
   key: getK("TEST"),
     valid: function() {
     return true;
}
});

2 个答案:

答案 0 :(得分:5)

单元测试假设逐行测试代码以获得完全覆盖。

考虑到getK作为FiltersService方法公开,它是

expect(this.service.getK).toEqual(jasmine.any(Function));

var key = {};
var result = this.service.getK(key);

expect(result).toEqual(jasmine.any(Function));
expect(result()).toBe(key);

在这个规范中不需要间谍,因为没有什么可以窥探的。

答案 1 :(得分:2)

由于调用父函数返回一个函数,调用父函数,并立即调用父函数返回的匿名函数:

expect(service.getK(k)()).toEqual(k);

这很简单,应该适合你。