我有一个收集'锻炼'如下:
Workouts = new Mongo.Collection('workouts');
Meteor.methods({
workoutInsert: function () {
var user = Meteor.user();
check(user._id, String);
var workout = {
completed: false,
createdAt: new Date(),
userId: user._id
};
var workoutId = Workouts.insert(workout);
return {
_id: workoutId
};
}
});
我想知道:
1)对于这种方法,Velocity + Jasmine测试会是什么样的?我不确定从哪里开始,真的很感激和榜样!
2)这是定义此方法并将其称为客户端方法的最佳实践吗?或者我应该创建一个Workout类并从该类的实例方法添加调用此方法?或者我应该将Workouts扩展为它自己的类并为其添加实例方法?
答案 0 :(得分:3)
在Meteor中有几种类型的测试:客户端集成,客户端单元,服务器集成和服务器单元。
集成测试会反映您的站点,并将为您加载Meteor方法(即.shirtInsert)。
如果我正在测试这个,我可能会有以下内容:
//File Location: app/tests/server/integration/workoutsSpec.js
Jasmine.onTest(function () {
describe('workouts', function () {
it("should call to Workouts.insert",function(){
//Make user return truthy _id for testing
Meteor.user() = function(){return {_id : "1";}}
//Setup a spy to watch for calls to Workouts.insert
spyOn("Workouts",insert);
//Call workoutInsert Meteor Method
Meteor.call('workoutInsert');
//Verify if Workouts.insert was called
expect("Workouts.insert").toHaveBeenCalled();
});
});
});
最后,MeteorJS为您提供了很多关于如何实现事物的自由,并且没有明确的最佳方法来处理适合每种情况的事情。虽然,我建议不要在客户端上放置任何与数据库交互的代码。您的client folder is publicly accessible/readable位于用户的任何内容(他们是否需要查看低级验证详细信息?)。
答案 1 :(得分:0)
要回答第二个问题,最佳做法是将Meteor方法隔离在服务器目录中。 Meteor使用这些保留的目录名称来控制提供给客户端,服务器或两者的资源。您不需要将它们放在与Mongo集合相同的文件或目录中,因为所有集合都可以在客户端和服务器上使用。这通常被认为是最佳实践,特别是如果您使用像angular-meteor这样的框架,它依赖于客户端上可用的Collection定义,以便可以将过滤器传递给它们。您可以使用collection.allow()/deny()
因此,如果您将所有集合保存在collections/
目录中,则可以这样定义:
Workouts = new Mongo.Collection('workouts');
将是collections/workouts.js
然后,在server/
目录中,与collections/
处于同一级别,您可以将所有方法放在此级别或更深层的文件中,如{{1} } 目录。然后,如果您愿意,可以将方法放在此目录中的server/methods/
中。
workouts.js