Meteor 如何使用Velocity+测试自定义流星方法;茉莉花

Meteor 如何使用Velocity+测试自定义流星方法;茉莉花,meteor,jasmine,velocity,Meteor,Jasmine,Velocity,我有一系列“训练”如下: Workouts = new Mongo.Collection('workouts'); Meteor.methods({ workoutInsert: function () { var user = Meteor.user(); check(user._id, String); var workout = { completed: false, createdAt: new Date(), use

我有一系列“训练”如下:

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) 这是定义此方法并将其称为客户端的最佳实践吗?或者我应该创建一个训练类,并从该类的实例方法中添加并调用该方法?或者我是否应该将训练扩展为它自己的类并添加实例方法?

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

集成测试反映您的站点,并将为您加载Meteor方法(即WorkUtinSert)

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

//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 meteor之类的框架,这些框架依赖于客户端上可用的集合定义,因此可以将过滤器传递给它们。您可以使用
集合。allow()/deny()

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

Workouts = new Mongo.Collection('workouts');
将是
collections/workouts.js

然后,在您的
服务器/
目录中,与您的
集合/
处于同一级别,您可以将所有方法放在该级别的文件中或树中更深的位置,如
服务器/方法/
目录。然后,如果您愿意,您可以将您的方法放入此目录中的
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
    };
  }
});

“最好的做法是将Meteor方法隔离在服务器目录上”,但是方法存根和延迟补偿呢?@Kyll Meteor的延迟到目前为止还没有问题。如果您在客户端有警惕的订阅管理(例如停止对视图外模板的订阅等),那么即使有大量收集,您也可以降低延迟。方法存根是我仍然习惯的东西,但是Meteor的官方测试框架Velocity在为您管理存根方面做得不错,到目前为止,我在这方面有很好的经验。我的意思是,通过在服务器端隔离您的方法,您将失去客户端预测更改和乐观地更新UI的能力。Meteor.methods是在服务器上定义的,专门用于使用Meteor.call()的客户端。这是任何安全的Meteor应用程序的基础。是的,但是如果它们也在客户端上定义,那么客户端会乐观地运行数据库更新。这就是通过方法存根进行延迟补偿的目的。。。