2016-05-27 21 views
3

でMeteor.usersをテストする方法:次のように私は機能を持っているモカ

if(Meteor.isServer) { 
Meteor.methods({ 
    addUser: function (newUser) { 
     check(newUser, { email: String, password: String }); 
     userId = Accounts.createUser(newUser); 
     return userId; 
    }, 
    getUser: function (userID) { 
     check(userID, String); 
     return Meteor.users.find({_id: userID}).fetch(); 
    } 
}); 

を私はモカ使用してこの機能をテストしようとしています:

if (Meteor.isServer) { 
let testUser; 
describe('Users',() => { 
    it("Add User", (done) => { 

     testUser = {email: '[email protected]', password: 'test'}; 

     try { 
      testUser._id = Meteor.call('addUser', testUser); 
      console.log(Accounts.users.find({_id: testUser._id}).fetch()); 
      done(); 
     } catch (err) { 
      assert.fail(); 
     } 
    }); 

    it("Get user", (done) => { 
     try { 
      Meteor.call('getUser', testUser._id); 
      done(); 
     } catch (err) { 
      assert.fail(); 
     } 
    }); 
}); 

そして、私は流星の呼び出しがあることを知っています'addUser'は動作します。その後のconsole.logは、私が作成したユーザーを返し、 "流星テスト - ドライバパッケージ実用的な:mocha"で実行すると最初のテストが成功するためです

しかし、セコにND私は流星コール「のgetUser」でユーザーを取得しよう部分を、テスト、その後私は立ち往生:

「メソッドを呼び出すことはできません 『』未定義の」

を見つける今、私は違いがあることを知っています私はユーザーを見つけるために 'Account.users'の代わりに 'Meteor.users'を使用していますが、これらの2つの違いが何であるかは完全に暗いです。すべてのMeteor.usersメソッド呼び出しをAccounts.userメソッド呼び出しで置き換える必要がありますか?どのようにこれをテストしますか?

答えて

0

私は数時間前に同じ問題を扱っていたので、私はこの記事を見つけました。

あなたのコードでわかるように、testUserは最初のユニット(it("Add User"...){})で定義されています。 2番目のユニットの最初のユニットの値を使用しないことをお勧めします。

beforeEachとafterEachを使用して、各ユニットのクリーンセットアップを行い、次に2番目のテストユニットで新しいユーザーを作成することができます。あなたの「のgetUser」メソッドは、配列を返すことを、

describe('Users',() => { 

    // use this for each test 
    let testUser; 


    beforeEach(() => { 
     // let's always create a new clean testUser object 
     testUser = {email: '[email protected]', password: 'test'}; 
    }); 

    afterEach(() => { 
     // Remove the user to keep our db clean 
     if (testUser._id) 
      Meteor.users.remove(testUser._id); 
    }); 

    it("Add User", (done) => { 
     testUser._id = Meteor.call('addUser', testUser); 
     const users = Meteor.users.find({_id: testUser._id}).fetch(); 
     const user = users[0]; 
     assert.isNotNull(user); 
     assert.isDefined(user); 
     assert.equal(user._id, testUser._id); 
     done(); 

    }); 

    it("Get user", (done) => { 
     // get a new id from our previously tested 
     // (and assume to be working) function 
     testUser._id = Meteor.call('addUser', testUser); 

     const user = Meteor.call('getUser', testUser._id); 
     assert.isNotNull(user); 
     assert.isDefined(user); 
     assert.equal(user._id, testUser._id); 
     done(); 
    }); 
}); 

私も見つかったので、私はそれを変更:また、各ユニットの後に、あなたのデシベルをクリーンアップする必要があり

getUser: function (userID) { 
    check(userID, String); 
    const users = Meteor.users.find({_id: userID}).fetch(); 
    return users[0]; 
} 

すべてがテストされ、実行されています。

+0

実際には、テスト用のユーザーアカウントを作成するためにMeteorメソッドを使用する必要はありません。テストのためのユーザーアカウントを作成する流星法を持つことは、かなり汚いです。 '' '' '' dburles:factory''パッケージを使って、テストユーザを(ロールの有無にかかわらず)作成し、検証したメソッドを実行することができます: '' 'methodName._execute(userId、data);' '' userIdはオブジェクトです: '' {userId:userId} ''と '' 'data'''はメソッドの引数です。また、コンテキストとしてuserIdを渡す通常の流星メソッドを呼び出すことができますが、デモのためにこのコメントにスペースがありません – Sean

+0

あなたがテストしたくない振る舞いを嘲笑するのは正しい方法です、私は同意します。この質問では、ユーザーアカウントを作成する方法がテスト対象のメソッドであり、テスト用に特別に設計されたメソッドではありません。したがって、私は@justanoobがどのように最小限の労力で問題を解決するかという有用な答えを示しました。私は、他のテストでは、ユーザの作成が暗黙のうちに集められていると仮定しました。 – Jankapunkt

+0

私はこれがポスターのオリジナルの質問に答えないと思います。私が知る限り、 'find is undefined'エラーについては説明しませんが、いくつかの詳細を見逃している可能性があります。私はOPと同じ問題を抱えていますが、Accounts.users.findとMeteor.users.findの両方が同じエラーをスローします:未定義のプロパティ 'find'を読み取ることができません。私の場合、私は1つのユニットで作成し、もう一方のユニットをチェックしていません。私はこれに絶対に困惑し、どこでも答えを見つけることができません。 –

関連する問題