2016-06-25 13 views
0

Ich versuche, einen Komponententest zum Einfügen (und dann Abrufen) eines Dokuments in mongodb zu schreiben. Allerdings bekomme ich einen Timeout-Fehler, und es schlägt vor, dass done nie aufgerufen wird. (Mongod läuft, und ich kann die Objekte sehen ganz gut als abgerufen und eingesetzt wird, console.log verwenden.)Wie schreibe ich einen Komponententest zum Einfügen und Abrufen eines Objekts zu mongodb mit Mungo, Mocha und Chai?

Was ich verwende:

Node.js, ES6, Mongoose, Mokka, Chai

CheckbookEntry ist eine seltsame Wrapper für einige Mongoose Anrufe, die das lassen Sie mich mit dem Versprechen arbeiten.

describe('create and getOneById',() => { 
    it('creates a new checkbookEntry, and retrieves it from the db', (done) => { 
     var EXAMPLE_ENTRY = { 
      type: 'debit', 
      date: Date(), 
      description: 'Example of a cb entry', 
      account: 'PNC', 
      amount: 239.33 
     }; 

     CheckbookEntry.create(EXAMPLE_ENTRY.type, 
           EXAMPLE_ENTRY.date, 
           EXAMPLE_ENTRY.description, 
           EXAMPLE_ENTRY.account, 
           EXAMPLE_ENTRY.amount) 
         .then(function(createdEntry){ 
          return CheckbookEntry.getOneById(createdEntry._id); 
         }) 
         .then(function(foundEntry){ 
          expect(foundEntry).to.eql(EXAMPLE_ENTRY); 
          done(); 
         }, function(err){ 
          assert.fail(err); 
          done(); 
         }); 
    }).timeout(5000); 

}); // end describe create 

Irgendwelche Vorschläge, wie man das funktioniert?

Antwort

1

Ich kann nur raten, aber ich denke, dass das Problem durch diesen verursacht werden kann:

.then(function(foundEntry){ 
    expect(foundEntry).to.eql(EXAMPLE_ENTRY); 
    done(); 
}, function(err){ 
    assert.fail(err); 
    done(); 
}); 

Insbesondere unter Verwendung von Behauptungen in einem erfülltes/Ablehnung Handler die Versprechen Kette ohne Fortsetzung. Wenn die Assertion eine Exception auslöst, wird done() nie aufgerufen. Je nachdem, welche Implementierung für das Versprechen verwendet wird, werden Sie möglicherweise nicht einmal über die Ausnahme benachrichtigt. Außerdem löst eine Ausnahme, die im Handler onFulFilled ausgelöst wird, nicht den onRejected-Handler aus, der an die gleiche -Methode übergeben wurde.

Da Mokka supports promises out of the box, anstatt die done Rückruf, Rückkehr Ihr Versprechen Kette:

return CheckbookEntry.create(...) 
        .then(...) 
        .then(..., ...); 

Auf diese Weise wird die Ausnahme von Mocha bekommen vermehrt zurück, die damit umgehen wird.

FWIW, Mungo also supports promises out of the box.