2015-06-26 5 views
0

Я пытаюсь ввести макет для тестирования с использованием мокко. Но похоже, что макет не взят, и тест по-прежнему использует реальные данные с сервера. Я пытаюсь получить данные из foursquare.Почему rewire не вводит макет для тестирования в nodejs?

Вот мой код.

var foursquare = require('foursquarevenues'), 
    Promise = require('promise'), 
    _ = require('underscore'); 

var Foursquare = function(client_id, client_secret) { 
    this.the_4sqr_lib = foursquare(client_id, client_secret); 

}; 
Foursquare.prototype.getVenue = function(id) { 
    var self = this; 
    return new Promise(function(resolve, reject) { 
     self.the_4sqr_lib.getVenue({'venue_id' : id}, function(error, response) { 
      if(error) { 
       reject(error); 
      } 
      var venueData = response.response.venue; 
      var firstPhoto = venueData.photos.groups[0].items[0]; 
      var theVenue = { 
       id: venueData.id, 
       name: venueData.name, 
       photo: firstPhoto.prefix + firstPhoto.width + 'x' + firstPhoto.height + firstPhoto.suffix, 
       url: venueData.canonicalUrl 
      }; 
      resolve(theVenue); 
     }); 
    }); 
    }; 

module.exports = Foursquare; 

А вот мой тест

var rewire = require("rewire"), 
    Foursquare = rewire('../../lib/foursquare.js'); 

     var client_id, client_secret, foursquare; 
     beforeEach(function() { 
      client_id = process.env.FOURSQUARE_CLIENT_ID; 
      client_secret = process.env.FOURSQUARE_CLIENT_SECRET; 
      foursquare = new Foursquare(client_id, client_secret); 
     }); 
     it('should get venue without photo', function(done) { 
      var mockFoursquare = { 
       getVenue : function(id, cb) { 
        var response = { 
         response : { 
          response : { 
           venue : { 
            photos : { 
             count:0, 
             groups : [] 
            } 
           } 
          } 
         } 
        } 
        cb(null, response); 
       } 
      }; 

      Foursquare.__set__('foursquarevenues', mockFoursquare); 

      var venue = foursquare.getVenue('430d0a00f964a5203e271fe3'); 
      venue.then(function(venue) { 
      venue.id.should.equal(''); 
      venue.name.should.equal(''); 
      venue.photo.should.equal(''); 
      venue.url.should.equal(''); 
      done(); 
      }).catch(done); 
     }); 

Я ожидаю, что тест на провал из-за undefined, но это по-прежнему получать реальные данные.

+0

Что делать, если вы издеваетесь перед 'new Foursquare (client_id, client_secret)'? –

+0

Результат все тот же. – toy

ответ

0

У меня была такая же проблема при использовании var self = this;. Методы, называемые как self.someMethod(), не издевались.

Я частично решить ее путем присвоения издеваться без ReWire:

MyModule = rewire('../lib/MyModule'); 
MyModule.__set__({"someMethodNotUsingSelf": function(){...}}); 
MyModule.someMethodThatUsesSelf = function() { //some mock code }; 
someValue.should.equal('something'); 
//... 

Надеется, что это помогает!

 Смежные вопросы

  • Нет связанных вопросов^_^