2017-03-20 3 views
0

Je crée un post-API et utilise le modèle mongoose pour enregistrer les données de la requête dans la base de données. Ensuite, j'utilise un postier pour tester cette API. Tout fonctionne. Tout fonctionne, je veux dire la collection créée, les données enregistrées dans la collection, et obtenir des données de réponse. voir le code suivantLa sauvegarde du modèle mongoose ne déclenche pas de callback et passe à chai-http lorsque la collection n'existe pas en mongo

const eSchema = new mongoose.Schema({ 
     model: String, 
     year: Number, 
     price: Number 
    }); 

    const eModel = mongoose.model('bmw', eSchema); 

    app.post('/api/bmw', (req, res) => { 
     const newRecord = new eModel(req.body); 
     newRecord.save((error, record) => { 
     res.status(201).send(record); 
     }); 
    }); 

Ensuite, j'essaie d'ajouter un test à cette API. J'utilise le moka avec chai-http. voir le code suivant

let chai = require('chai'); 
    const chaiHttp = require('chai-http'); 
    chai.use(chaiHttp); 

    it('POST /api/bmw',() => { 
     chai 
     .request(app) 
     .post('/api/bmw') 
     .send({ model: '440i', year: 2018, price: 85000 }) 
     .end((error, res) => { 
     console.log('POST', res.body); 
     }); 
    }); 

Etape 1: Base de données Drop (pas db, aucune collection)

Etape 2: Je lance le test en utilisant le chemin à test fichier mocha --timeout 20000

Etape 3 : répétez l'étape2

Après l'étape 2, je ne vois aucune donnée enregistrée (console.log ('POST', res.body)). cependant, la collection a été créée et les données ont été enregistrées dans la base de données mongo.

Après l'étape 3, je vois les données enregistrées. Je suppose que la collection existe déjà dans mongo base sur le step2.

Ensuite, je fais un pas de plus. Je répète de l'étape 1 à l'étape 3. mais cette fois j'ai mis un journal dans le rappel de sauvegarde du modèle, puis j'ai réalisé que le rappel n'est pas appelé après l'étape 2. Mais si j'utilise posman au lieu de chai-http, cela fonctionne à chaque fois.

Est-ce que quelqu'un a le même problème? Est-ce un problème de capacité entre le modèle mongoose et le chai-http? Ai-je manqué des réglages ou quoi que ce soit? Personnellement, je pense que cela devrait fonctionner quelle que soit la collection existe dans Mongo.

Répondre

1

cette API est une requête asynchrone. vous devez passer la fonction done dans votre bloc it() pour marquer l'achèvement ... comme ci-dessous:

let chai = require('chai'); 
const chaiHttp = require('chai-http'); 
chai.use(chaiHttp); 

it('POST /api/bmw', (done) => { 
    chai 
    .request(app) 
    .post('/api/bmw') 
    .send({ model: '440i', year: 2018, price: 85000 }) 
    .end((error, res) => { 
    if(error) done(error) 
    else{ 
     console.log('POST', res.body); 
     done(); 
    } 
    }); 
});