如何使用Velocity+Jasmine测试自定义流星方法



我有一个集合"训练"如下:

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扩展为它自己的类并添加实例方法吗?

Meteor中有几种类型的测试:客户端集成、客户端单元、服务器集成和服务器单元。

集成测试镜像您的站点,并将为您加载Meteor方法(即workoutInsert)。

如果我测试这个,我可能会有这样的东西:

//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在如何实现方面给了你很大的自由,并且没有明确的最佳方法来实现适用于每个场景的事情。尽管如此,我还是建议不要在客户端上放置任何与数据库交互的代码。位于客户端文件夹中的任何内容都可以供用户公开访问/阅读(他们需要查看低级别验证详细信息吗?)。

要回答第二个问题,最佳做法是将Meteor方法隔离在服务器目录中。Meteor使用这些保留的目录名来控制提供给客户端、服务器或两者的资源。您不需要将它们与Mongo集合放在同一文件或目录中,因为所有集合都可以在客户端和服务器上使用。这通常被认为是最佳实践,尤其是如果您使用的是像angular meter这样的框架,这些框架依赖于客户端上可用的Collection定义,以便可以将过滤器传递给它们。您可以使用collection.allow()/deny() 在上保护和修改这些集合的权限

因此,如果您将所有集合保存在collections/目录中,则可以这样定义它们:

Workouts = new Mongo.Collection('workouts');

将是collections/workouts.js 的内容

然后,在server/目录中,在与collections/相同的级别上,可以将所有方法放在该级别或树中更深的文件中,如server/methods/目录。然后,如果您愿意,您可以将方法放在该目录中的workouts.js中。

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
    };
  }
});

最新更新