访问Jasmine中的流星模板助手功能以进行集成测试

时间:2014-10-28 18:52:42

标签: javascript unit-testing templates meteor jasmine

我正在尝试在流星项目上运行Jasmine客户端集成测试。我正在使用meteor 0.9.4和Jasmine的sanjo:jasmine包。

我写了一个看起来像的测试:

describe("Template.dashboard.tasks", function() {

    it("ela displays correct assessment", function() {
        Session.set("selected_subject", "math");
        Session.set('selected_grade', "1");

        tasks = Template.dashboard.tasks();
        expect(true).toBe(true);
    });
});

我在测试结束前收到错误:

Cannot read property 'tasks' of undefined

这意味着此测试范围内不存在Template.dashboard

Template.dashboard.tasks()是一个完全有效的辅助函数,它位于视图文件夹中的js文件中。常规Jasmine测试按预期工作,但是一旦我尝试使用另一个文件中的一个函数,它就不起作用。

我的问题是:我需要做些什么才能让Jasmine测试访问我的模板帮助函数?

3 个答案:

答案 0 :(得分:6)

在Meteor中,模板助手函数的格式如下:

Template.dashboard.tasks = function () {
    ...
};

但已弃用,新格式为:

Template.dashboard.helpers({
    tasks: function(){
        ...
    }
});

在Jasmine中,使用以前的格式,您可以访问辅助函数,如:

Template.dashboard.tasks();

但现在你必须调用这样的辅助函数:

Template.dashboard.__helpers[' tasks']();

Sanjometeor-jasmine repo的所有者)建议使用这样的函数来更容易调用辅助函数(特别是如果语法最终再次更改):

function callHelper(template, helperName, context, args) {
    context = context || {};
    args = args || [];
    template.__helpers[' ' + helperName].apply(context, args);  
}

答案 1 :(得分:2)

Meteor 1.3对此问题的更新答案(抱歉,我使用的是摩卡,但不影响答案):

在测试时不会急切地设置Template.foo和Template.foo帮助器,因此您需要导入foo.html 然后 foo.js

以下是一个例子:

import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating';
import { Foo } from '/collections/foo.js';
import { assert } from 'meteor/practicalmeteor:chai';
import './foo.html';  // now Template.foo is defined
import './foo.js';    // now Template.foo.__helpers[' bar'] is defined


describe('foo handlers', () => {
    it("Should test bar", () => {
       // don't forget the space, helper key is ' bar' not 'bar'
       var bar = Template.foo.__helpers[' bar'].apply({foo:"bar"},3); 
       assert.Equal(bar,'bar');
    });
});

当然,如前所述,你绝对应该将奇怪的Template.foo.__helpers[' bar'].apply(context,args)封装成一个漂亮,干净的助手。

答案 2 :(得分:0)

服务器部分的测试从一开始就运行良好,为了在前端部分运行测试,确实还有一件事要做。我会试着找到你。

此外,请再次阅读或阅读Llama博士与Jasmin / Meteor相关的着名文章:Bullet-proof Meteor applications with Velocity, Unit Testing, Integration Testing and Jasmine