我正在尝试在流星项目上运行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
测试访问我的模板帮助函数?
答案 0 :(得分:6)
在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) {
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