2016-12-24 53 views
5

Mam koszmar, który pisze testy jednostkowe dla meteorów. Jest zbyt wiele starych, przestarzałych artykułów i zbyt mało przejrzystych, odpowiednich dokumentów, aby móc opracować, co naprawdę muszę zrobić, aby to zadziałało.Jak testować metodę meteorytów za pomocą praktycznego meteorytu: mocha

Występuję z problemem po problemie i mam tylko nadzieję, że ktoś może mi pokazać, w jaki sposób napisałby test na jedną z moich metod, abym mógł zobaczyć, co zrobili i dokonać inżynierii wstecznej dla pozostałych metod .

Oto metoda Chciałbym napisać test:

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

Do tej pory mam poniżej:

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

Błędy powyższe badanie rzuca się najpierw mówi mi, że nie ma znaczenia, ponieważ jest to testowana przeze mnie metoda. Po drugie, metoda zgłasza błąd ("Nie masz autoryzacji, aby to zrobić"), więc nie rozpoznaje Meteor.userId() ani faktu, że użytkownik jest w roli "administratora".

Jeśli ktoś mógłby mi pokazać, jak testowałby tę metodę, byłbym bardzo wdzięczny!

Dzięki

+0

Użytkownik musi być zalogowany przed wywołaniem metody. nawet ja też mam podobny problem. Lemme, jeśli coś znalazłeś. –

Odpowiedz

1

myślę, że trzeba do stadniny metodę Meteor.user(), spróbuj tego:

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

trzeba dodać te pakiety: dburles:factory, xolvio:cleaner, practicalmeteor:sinon