使用Jasmine测试Meteor辅助函数时出错

时间:2016-02-24 09:36:58

标签: javascript unit-testing templates meteor jasmine

我在MeteorJS中有一个辅助函数,如下所示:

Template.cars.helpers({
    models : function() {
        var currentUserId = Meteor.userId();
        return cars.find({userId: currentUserId});
    }
});

我正在尝试编写一个Jasmine测试,它将检查调用models帮助程序时是否调用Meteor.userId()函数。我已经模拟了Meteor.userId()函数,我的代码如下:

describe("test cars collection", function() {

    beforeEach(function() {
        var Meteor = {
            userId: function() {
                return 1;
            }
        };        
    });

    it("userId should be called once", function() {
        Template.cars.__helpers[' models']();
        spyOn(Meteor, 'userId').and.callThrough();
        expect(Meteor.userId.calls.count()).toBe(1);
    });
}); 

但是,结果显示Expected 0 to be 1.我是Jasmine的新手,并且在调用Meteor.userId()帮助程序时并不知道如何正确调用models函数。我认为我监视它的方式是错误的,但我无法弄明白。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

来自Jasmine Docs

  

.calls.count():返回调用间谍的次数

但是你需要在调用函数之前设置间谍,这样你就可以检查你的函数是否只被调用过一次:

it("userId should be called once", function() {
    spyOn(Meteor, 'userId').and.callThrough(); // <-- spy on the function call first
    Template.cars.__helpers[' models'](); // <-- execute the code which calls `Meteor.userId()`
    expect(Meteor.userId.calls.count()).toBe(1); // <-- Now this should work
});