2016-12-24 59 views
5

Meteoroloji için bir kabus yazma ünitesi testleri yapıyorum. Çalışmak için gerçekten yapmak zorunda olduğum şeyleri yapabilmem için çok eski, eski modası geçmiş makaleler ve çok az açık, ilgili doküman parçaları var.Bir birim bir meteor yöntemini nasıl testmetre ile test eder: mocha

Sorun çıktıktan sonra problem yaşamaya devam ediyorum ve birisinin bana yöntemlerden biri için nasıl bir test yazacağını nasıl gösterebileceğini umuyoruz, böylece ne yaptıklarımı görebiliyor ve geri kalan yöntemlerim için tersine mühendislik uygulayabiliyorum. . İşte

Ben bir test yazmak istiyorum bir yöntem var:

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

Şimdiye kadar aşağıda var: Yukarıdaki Test atar

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

hataları öncelikle vardır o söyler bana bu Meteor.userId can only be invoked in method calls. Use this.userId in publish functions. bu alakasız, çünkü bu test ettiğim bir yöntem. İkincisi, yöntem hatayı atar ('Bunu yapmaya yetkili değilsiniz), ya Meteor.userId() işlevini veya kullanıcının' yönetici 'rolünde olduğunu algılamaz.

Birisi bana bu yöntemi nasıl test edeceklerini gösterebilirse gerçekten takdir ediyorum!

Teşekkür

Sana Meteor.user() yöntemi aygırlığa gerek
+0

Kullanıcı giriş gerekir yöntem çağrılmadan önce. hatta ben de aynı problemle karşılaşıyorum. Bir şey bulursan, biliyorum Lemme. –

cevap

1

, şunu deneyin:

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

Bu paketler eklemek gerekir: dburles:factory, xolvio:cleaner, practicalmeteor:sinon