2016-12-27 4 views
1

私のメソッドのユニットテストを書いています。 これらのメソッドをテストするにはどうすればよいですか?流星での認証が必要なメソッド/パブリケーションのユニットテスト

これまで、practicalmeteor:mochaというテストを書いて、新しいユーザーを作成し、そのユーザーとログインしました。

describe('login method', function() { 
let logingKey; 
beforeEach(function() { 
    Meteor.users.remove({}); 
    const createUser = Meteor.server.method_handlers['registerUser']; 
    let params = { 
    username: 'testUsername' 
    } 
    res = createUser.apply({}, [params]); 
    logingKey = res.key; 
}); 

it('can provide authentication', function() { 
    const loginUser = Meteor.server.method_handlers['login']; 
    let params = { 
    key: logingKey 
    } 
    console.log(params); 
    loginUser.apply({}, [params]); 
}); 

私はアプリケーションで正常に動作生成されたキーにログインするカスタムログインハンドラを書いたが、テスト結果に、私は次のエラーを取得しています。

Error: Cannot read property 'id' of undefined 
at AccountsServer.Ap._setLoginToken (packages/accounts-base/accounts_server.js:889:35) 
at packages/accounts-base/accounts_server.js:288:10 
at Object.Meteor._noYieldsAllowed (packages/meteor.js:671:12) 
at AccountsServer.Ap._loginUser (packages/accounts-base/accounts_server.js:287:10) 
at AccountsServer.Ap._attemptLogin (packages/accounts-base/accounts_server.js:349:12) 
at Object.methods.login (packages/accounts-base/accounts_server.js:533:21) 
at Object.methodMap.(anonymous function) (packages/meteorhacks_kadira.js:2731:30) 
at Test.<anonymous> (imports/api/methods/loginUser.tests.js:30:17) 
at run (packages/practicalmeteor:mocha-core/server.js:34:29) 
at Context.wrappedFunction (packages/practicalmeteor:mocha-core/server.js:63:33) 

ここで間違っていますか?任意の提案は、事前に感謝の歓迎です。

Original post on meteor forum

UPDATE

OK!ここで私の苦悩です、私はこのメソッドの単体テストを書いたと言う、私はどのように確認するか、ここでuserIdを取得する必要があります。 (あなたは空のオブジェクトを提供しながら、Method Invocation objectする必要があります)

Meteor.methods({ 
    userStatus:function(update){ 
     check(update, {online: String}) 
     if (! this.userId) { 
      throw new Meteor.Error('error-not-authorized','User need to login', {method: "userStatus"}) 
     } 
     try { 
     Meteor.users.update(Meteor.userId(),{$set: {'status.online': !!parseInt(update.online)}}) 
     } catch (e) { 
     console.error("Error",e); 
     } 
    } 
}); 

答えて

0

あなたは直接、適切なコンテキストなしメソッド・ハンドラを呼び出しています。 loginメソッドハンドラは接続IDを取得しようとしますが、失敗します。

パッケージのaccounts-baseパッケージとの統合をテストする場合(基本的にコードの一部を呼び出すときに)、接続を作成してその接続でメソッドを呼び出すことができます。

let connection = DDP.connect(Meteor.absoluteUrl()); 
// prepare the login data 
const params = {/*...*/}; 
connection.call('login', params); 
// test post conditions 
connection.disconnect(); 

編集(次の質問を編集):

答えはほとんど同じまま。 loginメソッドを呼び出してログインした後は、サーバーの接続状態にログインしているユーザーのIDを含める必要があります。これで、ユーザーがログインする必要のあるメソッドを呼び出すことができます。this.userIdは、すべての場合に使用する必要があります(Meteor.userId()ではなく)。

+0

あなたは、ログインしたユーザーが必要なメソッドでユニットテストを実行できません。 –

+0

つまり、呼び出しオブジェクトなしで呼び出しオブジェクトに依存するメソッドハンドラを呼び出すことはできません。いずれかを模倣(接続を含む)または実証されているように一時的な接続を使用してください。 – MasterAM

+0

質問を更新しました。この場合ユニットテストを書くべきですか? '私の問題は –

関連する問題