2017-02-06 4 views
0

J'utilise mocha et chai (avec chai-as-promised) et je suis en train de tester une base de données MongoDB en utilisant mockgoose.test de Mocha se bloque lorsque l'on compare l'objet mangouste avec un objet

Le modèle:

var Campaign = new Schema({ 
    //Schema here 
}); 

Campaign.statics.getOneById = function(id) { 
    return this.findOne({_id: id }).populate('channels').populate('units'); 
}; 

Le code testé:

function getCampaignById(id) { 
    return Campaign.getOneById(id); 
} 

Le code de test:

var chai = require('chai'), 
    chaiAsPromised = require('chai-as-promised'), 
    mongoose = require('mongoose'), 
    mockgoose = require('mockgoose'), 
    Campaign = require('../src/campaigns/models/campaign-model'), 
    Channel = require('../src/channels/models/channel-model'), 
    Unit = require('../src/units/models/unit-model'), 
    campaignRepo = require('../src/campaigns/lib/campaign-repository'), 
    config = require('../scripts/services/config'); 

chai.use(chaiAsPromised); 
chai.should(); 

before(function(done) { 
    mockgoose(mongoose).then(function() { 
     mongoose.connect(config.db.dbStr, function(err) { 
      done(err); 
     }) 
    }) 
}); 

describe('Campaign repository', function() { 

    var fullCampaign = { 
     country: { 
      dst:1, 
      timezone:'+02:00', 
      code:'AX', 
      name:'Åland Islands'}, 
     name: 'This is campaign name', 
     startDate:'2017-02-19T22:00:00.000Z', 
     endDate:'2017-02-27T22:00:00.000Z', 
     creatives: ['creative'], 
     units:[], 
     channels:[], 
     money: { 
      action: { 
       event: 'interaction_loaded', 
       label: 'View' 
      }, 
      currency: { 
       code: 'USD', 
       sign: '$' 
      }, 
      budget: 11111, 
      costPerAction: 2 
     } 
    }; 

    var newCampaign; 

    it('should create a new campaign', function() { 
     campaignRepo.create(fullCampaign).then(function(createdCampaign) { 
      newCampaign = createdCampaign; 
     }); 
    }); 

    it('should get the new campaign from the database', function() { 
     return (campaignRepo.getCampaignById(newCampaign._id)).should.eventually.equal(newCampaign); 
    }); 
}); 

Le problème est que la dernière vérification de l'égalité se bloque mocha:

Campaign repository 
    ✓ should create a new campaign 
    1) should get the new campaign from the database 


    1 passing (141ms) 
    1 failing 

Et quand faire les mêmes tests sur un objet non,

return (campaignRepo.getCampaignById(scopeNewCampaign._id)).should.eventually.equal('just a string'); 

mocha ne vient normalement.

Campaign repository 
    ✓ should create a new campaign 
    1) should get the new campaign from the database 


    1 passing (141ms) 
    1 failing 

    1) Campaign repository should get the new campaign from the database: 
    AssertionError: expected { Object ($__, isNew, ...) } to equal 'just a string' 

Répondre

0

Vous ne savez pas si c'est la racine de votre problème, mais c'est trop long pour un commentaire. D'abord, vous ne renvoyez pas la promesse dans votre premier cas de test. Par conséquent, le moka n'attend pas que votre objet soit créé. Cela pourrait être la cause de l'échec de votre deuxième test. Alors essayez ceci:

it('should create a new campaign', function() { 
    return campaignRepo.create(fullCampaign).then(function(createdCampaign) { 
     newCampaign = createdCampaign; 
    }); 
}); 

Deuxièmement, c'est un très mauvais style de rendre vos tests dépendants les uns des autres. C'est beaucoup plus propre, si chaque cas de test peut être exécuté seul. Sinon, tous vos tests consécutifs échoueront si le premier erreurs et vous ne voyez pas pourquoi. Cela peut sembler un peu beaucoup de travail lors de la première installation, mais c'est déf. vaut à long terme. Sinon, vous vous retrouverez confus de tests qui échouent qui sont vraiment bien.

+0

Malheureusement, votre proposition ne fonctionne pas, et comme je l'ai dit, le problème est plus que l'échec du test, c'est toute la suite de tests qui bloque le terminal. En ce qui concerne votre deuxième point, vous avez tout à fait raison, mais comme je commence à écrire ces tests et que j'ai rencontré ce problème, je n'ai pas entièrement conçu les tests. – dabn

+0

Avez-vous une connexion à une base de données? –

+0

une autre chose que je viens de remarquer, comme vous comparez les objets, vous devez utiliser l'égalité profonde: '.should.eventually.deep.equal' –