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

del*_*eli 6 velocity jasmine meteor

我有一个收集'锻炼'如下:

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
    };
  }
});
Run Code Online (Sandbox Code Playgroud)

我想知道:

1)对于这种方法,Velocity + Jasmine测试会是什么样的?我不确定从哪里开始,真的很感激和榜样!

2)这是定义此方法并将其称为客户端方法的最佳实践吗?或者我应该创建一个Workout类并从该类的实例方法添加调用此方法?或者我应该将Workouts扩展为它自己的类并为其添加实例方法?

Joe*_*Joe 3

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

集成测试反映了您的站点,并将为您加载 Meteor 方法(即锻炼插入)。

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

//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();
       });
    });
});
Run Code Online (Sandbox Code Playgroud)

最后,MeteorJS 为您提供了很大的自由来决定如何实现事物,并且没有明确的最佳方法来实现适合每种场景的事物。不过,我建议不要在客户端上放置任何与数据库交互的代码。您的用户可以公开访问/读取您的客户端文件夹中的任何内容(他们需要查看低级验证详细信息吗?)。