在 Jasmine 中访问 Meteor 模板辅助函数以进行集成测试

Posted

技术标签:

【中文标题】在 Jasmine 中访问 Meteor 模板辅助函数以进行集成测试【英文标题】:Accessing a Meteor Template Helper Function in Jasmine for Integration Testing 【发布时间】:2014-12-24 07:50:21 【问题描述】:

我正在尝试在一个流星项目上运行 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 测试访问我的模板辅助函数吗?

【问题讨论】:

【参考方案1】:

在 Meteor 中,模板辅助函数过去的格式如下:

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

但这已经被弃用了,新的格式是:

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

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

Template.dashboard.tasks();

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

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

Sanjo(meteor-jasmine repo 的原作者)建议使用这样的函数来更容易调用辅助函数(尤其是在语法最终再次更改时):

function callHelper(template, helperName, context = , args = []) 
    template.__helpers[` $helperName`].apply(context, args);

【讨论】:

【参考方案2】:

Meteor 1.3 对此问题的更新答案(对不起,我使用 mocha,但不影响答案):

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) 封装成一个漂亮、干净的助手。

【讨论】:

【参考方案3】:

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

此外,考虑阅读或再次阅读 Llama 博士博客中与 Jasmin/Meteor 相关的著名且明确的文章:Bullet-proof Meteor applications with Velocity, Unit Testing, Integration Testing and Jasmine

【讨论】:

我已经阅读了那篇文章——我学到了很多东西,但我仍然无法让测试正常工作。您说要使客户端测试正常工作,还需要做一件事,那会是什么?

以上是关于在 Jasmine 中访问 Meteor 模板辅助函数以进行集成测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用帮助器的情况下访问 Meteor 模板中的全局变量?

Meteor - 从子助手访问父模板变量

在 Meteor 的模板渲染函数中访问父数据上下文

UI helper 函数在 Meteor 中没有订阅数据

Meteor:从另一个助手访问模板助手(或变量)

在 Meteor 中访问订阅的问题