2016-12-24 5 views
5

流星のためのユニットテストを書く悪夢があります。あまりにも多くの古くて古い記事があり、実際にこれを動作させるためには私が実際にやる必要があることを明確にするためのドキュメントがあまりにも少なすぎます。流星法を実用的な計器でユニットテストする方法:mocha

私は問題の後で問題に直面しています。誰かが自分のメソッドのテストを書く方法を私に見せてもらえるように、私は彼らが何をしているかを見て、残りのメソッド。ここで

は私がのためにテストを書きたいのですが方法です:

Meteor.methods({ 
    'client.new':(clientDetails) => { 
    check(clientDetails, { 
     name: String, 
     numberTeamMembers: String 
    }); 

    clientDetails.teamMembers = []; 

    if(!Meteor.userId() || !Roles.userIsInRole(Meteor.userId(), 'administrator')) { 
     throw new Meteor.Error('500', 'You are not authorised to do this.'); 
    } 

    if(Clients.findOne({ name: clientDetails.name})) { 
     throw new Meteor.Error('500', 'This client name already exists!'); 
    }; 

    return Clients.insert(clientDetails); 
    }, 
}); 

これまでのところ、私は以下の持っている:

import { Meteor } from 'meteor/meteor'; 
import { expect, be } from 'meteor/practicalmeteor:chai'; 
import { describe, it, before } from 'meteor/practicalmeteor:mocha'; 
import { resetDatabase } from 'meteor/xolvio:cleaner'; 
import { Random } from 'meteor/random'; 

import { Clients } from '/imports/api/clients/clients.js'; 

import '/imports/api/clients/server/methods.js'; 

describe('Client Methods in API', function() { 
    before(function() { 
    resetDatabase(); 
    }); 

    it('can create a Client', function(){ 
    let clientName = "Microsoft", 
     numberTeamMembers = "5", 
     data = { 
      name: clientName, 
      numberTeamMembers: numberTeamMembers 
     }; 

    let userId = Accounts.createUser({username: "admin", email: "[email protected]", password: "password"}); 
    Meteor.users.update({ _id: userId }, { $set: { roles: [ 'administrator' ] }}); 

    let method = Meteor.server.method_handlers['client.new']; 

    method.apply(userId, [data]); 


    let client = Clients.findOne(); 

    expect(Clients.find().count()).to.equal(1); 
    expect(client.name).to.equal(clientName); 
    expect(client.numberTeamMembers).to.equal(numberTeamMembers); 
    }); 
}); 

上記のテストは、スローエラーが最初にそれが伝えています私はMeteor.userId can only be invoked in method calls. Use this.userId in publish functions.これは私がテストしているメソッドなので、無関係です。第2に、Meteor.userId()またはユーザーが「管理者」ロールに属していることを認識しないように、このメソッドはエラー( 'これは実行権限がありません')をスローします。

誰かが私にその方法をテストする方法を示すことができたら、本当に感謝します!

おかげ

+0

ユーザーは、ログインする必要がありますbeforeメソッドが呼び出されます。私もちょっと同じ問題を抱えています。あなたが何かを見つけたら、Lemmeは知っている。 –

答えて

1

私はこのしてみてください、あなたはMeteor.user()方法をスタッドに必要だと思う:あなたはこれらのパッケージを追加する必要が

import { Meteor } from 'meteor/meteor'; 
import { resetDatabase } from 'meteor/xolvio:cleaner'; 
import { sinon } from 'meteor/practicalmeteor:sinon'; 

describe('...',() => { 
    let currentUser; 

    beforeEach(() => { 
    resetDatabase(); 
    Factory.define('user', Meteor.users, { 
     profile: { 
     // ... 
     }, 
    }); 
    currentUser = Factory.create('user'); 
    sinon.stub(Meteor, 'user'); 
    Meteor.user.returns(currentUser); 
    }); 

    afterEach(() => { 
    Meteor.user.restore(); 
    resetDatabase(); 
    }); 

    it('...',() => { 
    // ... 
    }); 
}); 

を:dburles:factoryxolvio:cleanerpracticalmeteor:sinon

関連する問題