2016-12-24 1 views
5

Ich habe einen Albtraum Schreibgerät Tests für Meteor. Es gibt zu viele alte, veraltete Artikel und zu wenige klare, relevante Dokumentationen, um herauszufinden, was ich eigentlich tun muss, um dies zum Laufen zu bringen.Wie Unit-Test eine Meteor-Methode mit Practicalmeteor: Mokka

Ich renne zu Problem nach Problem und nur wirklich hoffe jemand kann mir zeigen, wie sie einen Test für eine meiner Methoden schreiben würden, damit ich sehen kann, was sie getan haben und es für den Rest meiner Methoden zurückentwickeln .

hier ein Verfahren ist würde ich für einen Test schreiben:

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); 
    }); 
}); 

Die Fehler der obige Test sind zum einen wirft es sagt:

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); 
    }, 
}); 

Bisher habe ich die unten bekam mir, dass Meteor.userId can only be invoked in method calls. Use this.userId in publish functions. die irrelevant ist, weil dies eine Methode ist, die ich testen. Zweitens löst die Methode den Fehler aus ("Sie sind nicht dazu berechtigt"), so dass entweder Meteor.userId() oder die Tatsache, dass der Benutzer in der Rolle "Administrator" ist, nicht erkannt wird.

Wenn jemand mir zeigen könnte, wie sie diese Methode testen würden, würde ich es wirklich schätzen!

Dank

+0

Benutzer angemeldet sein müssen bevor die Methode aufgerufen wird. sogar ich stoße auf ein ähnliches Problem. Lass mich wissen, ob du etwas gefunden hast. –

Antwort

1

Ich glaube, Sie brauchen die Meteor.user() Methode Stud, versuchen Sie dies:

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('...',() => { 
    // ... 
    }); 
}); 

Sie müssen diese Pakete hinzuzufügen: dburles:factory, xolvio:cleaner, practicalmeteor:sinon