8

速度/ジャスミンを使用して、現在ログインしているユーザーが必要なサーバー側の方法をテストする方法に少し固執しています。ユーザーが stub/fake 経由でログインしていると Meteor に思わせる方法はありますか?

myServerSideModel.doThisServerSideThing = function(){
    var user = Meteor.user();
    if(!user) throw new Meteor.Error('403', 'not-autorized');
}

Jasmine.onTest(function () {
    describe("doThisServerSideThing", function(){
        it('should only work if user is logged in', function(){
            // this only works on the client :(
            Meteor.loginWithPassword('user','pwd', function(err){
                expect(err).toBeUndefined();

            });
        });
    });
});
4

4 に答える 4

5

できることは、ユーザーをテスト スイートだけに追加することです。これらのユーザーをサーバー側のテスト スクリプトに入力することで、これを行うことができます。

何かのようなもの:

Jasmine.onTest(function () {
  Meteor.startup(function() {
    if (!Meteor.users.findOne({username:'test-user'})) {
       Accounts.createUser
          username: 'test-user'
  ... etc

次に、beforeAllテストで を使用してログインすることをお勧めします (これはクライアント側です)。

Jasmine.onTest(function() {
  beforeAll(function(done) {
    Meteor.loginWithPassword('test-user','pwd', done);
  }
}

これは、テストがまだログインしていないことを前提としています。などをチェックしMeteor.user()て適切にログアウトすることで、これをより複雑にすることができます。コールバックを多くの関数にafterAll簡単に渡す方法に注意してください。doneAccounts

基本的に、ユーザーをモックする必要はありません。Velocity/Jasmine DB で、適切なロールを持つ適切なユーザーが利用できることを確認してください。

于 2015-03-03T16:55:14.313 に答える
5

次のようなサーバー側のメソッドがあるとします。

Meteor.methods({
    serverMethod: function(){
        // check if user logged in
        if(!this.userId) throw new Meteor.Error('not-authenticated', 'You must be logged in to do this!')

       // more stuff if user is logged in... 
       // ....
       return 'some result';
    }
});

メソッドを実行する前に Meteor.loginWithPassword を作成する必要はありません。メソッド関数呼び出しのコンテキストをthis.userId変更してスタブするだけです。this

定義された流星メソッドはすべて、Meteor.methodMapオブジェクトで使用できます。thisしたがって、別のコンテキストで関数を呼び出すだけです

describe('Method: serverMethod', function(){
    it('should error if not authenticated', function(){
         var thisContext = {userId: null};
         expect(Meteor.methodMap.serverMethod.call(thisContext).toThrow();
    });

    it('should return a result if authenticated', function(){
         var thisContext = {userId: 1};
         var result = Meteor.methodMap.serverMethod.call(thisContext);
         expect(result).toEqual('some result');
    });

});

編集: このソリューションは Meteor <= 1.0.x でのみテストされました

于 2015-03-08T06:42:26.897 に答える
1

何をテストしていて、ユーザーがログインする必要があるのはなぜですか? 私が持っているメソッドのほとんどは、ユーザー オブジェクトを渡すユーザー オブジェクトを必要とします。これにより、実際にログインせずにテストから呼び出すことができます。そのため、実際のコードの実行では...

var r = myMethod(Meteor.user());

しかし、テストから実行するときは、次のように呼び出します...

it('should be truthy', function () {
  var r = myMethod({_id: '1', username: 'testUser', ...});
  expect(r).toBeTruthy();
});
于 2015-03-02T03:50:27.380 に答える
1

少なくとも現在のバージョン (1.3.3) ではMeteor.server.method_handlers["nameOfMyMethod"]、Meteor メソッドを呼び出して適用し、最初のパラメーターとして指定できると思います。this

this.userId = userId;
Meteor.server.method_handlers["cart/addToCart"].apply(this, arguments);
于 2016-06-15T04:28:27.913 に答える