2016-06-09 4 views
0

Diese Frage zu Using Promises to test Meteor - MochaPromises in Mokka Einheits Tests

verwandt ist wie Louis vorgeschlagen, ich habe das gleiche Problem in einem kleineren Programm repliziert, so dass Sie diese reproduzieren kann. Und auch in diesem interessiert sich Mocha nicht für die Behauptung. Der Catch-Block der Versprechungen erhält diesen Fehler.

/server/main.js

import { Meteor } from 'meteor/meteor'; 

export const myCollection = new Mongo.Collection('mycollection'); 

export const addObject = function (id) { 
    myCollection.insert({ 
     name: 'test ' + id 
    }); 
} 

Meteor.publish('mycollection', function() { 
    return myCollection.find({}); 
}); 

/server/main.test.js

/** 
* Created by enigma on 6/9/16. 
*/ 
import { Meteor } from 'meteor/meteor'; 
import { PublicationCollector } from 'meteor/johanbrook:publication-collector'; 
import { Promise } from 'meteor/promise'; 
import { assert } from 'meteor/practicalmeteor:chai'; 
import { Random } from 'meteor/random'; 
import { addObject } from '../server/main.js'; 

if (Meteor.isServer) { 
    describe('test mocha promise', function() { 
     before(function() { 
      addObject(Random.id()); 
     }); 
     it('collects myCollection test', function() { 
      const collector = new PublicationCollector({ userId: Random.id()}); 

      return new Promise(function(resolve) { 
        collector.collect('mycollection', function (collections) { 
         resolve(collections); 
        }); 
      }).then(function(coll) { 
       chai.assert.notEqual(coll, null); 
       chai.assert.equal(coll, null); 
      }).catch(function(err) { 
       console.log('error:', err.stack); 
      }); 
     }); 
    }); 
} 

Konsolausgabe

=> Meteor server restarted 
I20160609-18:31:14.546(-5)? MochaRunner.runServerTests: Starting server side tests with run id GK3WqWY4Ln9u6vmsg 
I20160609-18:31:14.598(-5)? error: AssertionError: expected { Object (mycollection) } to equal null 
I20160609-18:31:14.598(-5)?  at Function.assert.equal (packages/practicalmeteor_chai.js:2635:10) 
I20160609-18:31:14.598(-5)?  at test/main.test.js:25:29 
I20160609-18:31:14.598(-5)?  at /Users/enigma/.meteor/packages/promise/.0.6.7.1d67q83++os+web.browser+web.cordova/npm/node_modules/meteor-promise/fiber_pool.js:33:40 
W20160609-18:31:14.607(-5)? (STDERR) MochaRunner.runServerTests: failures: 0 
+0

Sie sollten die Stack-Trace des empfangenen Fehlers drucken, es kann helfen, das Problem zu finden. – user3

+0

Ich bekomme keine Stack-Trace, '[TypeError: Kann Eigenschaft 'Call' von undefined nicht lesen]' das ist alles, was ich bekomme – goKishore

+0

versuchen Sie 'console.error (err.stack)' oder sogar den Haken zu entfernen, wenn ich mich erinnere korrekt Mokka druckt den Stack-Trace – user3

Antwort

1

Sie müssen entweder werfen Sie den Fang oder entfernen Sie den Fang, so dass Mocha auch den Fehler bekommt. Derzeit, da Sie den Fehler abfangen, ist das Versprechen, dass Mocha bekommt, gelöst.

war Below meine alte Antwort, bevor die Frage Änderung ps: es sieht aus wie ich das falsch verstanden, was ein für Meteor veröffentlichen so war die Antwort unten nicht wirklich korrekt ist


Der Fehler Sie begegnen ist weil "mycollection" nicht veröffentlicht wird

Ich bin wahrscheinlich, weil Meteor.publish('mycollection');is an async function, die Sammlung ist noch nicht veröffentlicht, wenn Sie es testen.

Sie sollten in einem before() vor Ihrem Test die veröffentlichen tun

Hier ist ein Beispiel dafür, wie man das in einer Warte veröffentlichen, bevor zu beenden

+0

danke für das Zeigen auf Publizieren, ich habe vergessen, die Callback-Funktion übergeben, bearbeitet den Code oben. – goKishore

+0

Ich bearbeitete meine Antwort auch, um ein Codebeispiel von dem zu zeigen, was ich meinte, hüte dich auch vor dem hinzugefügten 'addObject', es ist asynchron, also solltest du ein Versprechen geben, um Mocha zu erzählen, wenn es fertig ist – user3

+0

Ich habe meine Antwort noch einmal bearbeitet, für dich neu Frage, und hinzuzufügen, dass ich Dinge missverstanden habe – user3

0

ich dies in einer Diskussion lesen, das funktioniert für mich , obwohl einige den Gebrauch von "fertig" Callback mit Versprechen entmutigen.

it('collects myCollection test', function(done) { 
     const collector = new PublicationCollector({ userId: Random.id()}); 

     return new Promise(function(resolve) { 
       collector.collect('mycollection', function (collections) { 
        resolve(collections); 
       }); 
     }).then(function(coll) { 
      chai.assert.notEqual(coll, null); 
      chai.assert.equal(coll, null); 
      done(); 
     }).catch(function(err) { 
      done(err); 
     }); 
    });