2017-05-25 2 views
2

J'ai une application Node qui se connecte aux API Twitter REST et streaming. Afin de tester le code qui fait la demande à l'API REST, je peux utiliser Nock pour intercepter la requête HTTP et renvoyer des données fausses comme ceci:Comment renvoyer des données fictives à partir des demandes envoyées à l'API Twitter Streaming dans le nœud

var nock = require('nock') 

var mockData = [...] 

nock('https://api.twitter.com/1.1') 
.get('/search/tweets.json') 
.reply(200, mockData) 

Mon application se connecte également à l'extrémité de l'API de streaming statuses/filter et effectue une analyse sur les tweets reçus via l'API de streaming. In Nock's README il indique que vous pouvez passer une fonction à .query() qui renvoie un flux, mais je n'ai pas réussi à faire fonctionner cela. Comment puis-je retourner les données fictives des demandes à ce point de terminaison en utilisant Nock (ou une autre bibliothèque si nécessaire)? Je voudrais idéalement être en mesure d'envoyer des tweets au flux dans mes tests chaque fois que je dois, par exemple:

it('should correctly process tweets coming in on the streaming API',() => { 
    var mockTweet = {...} 

    sendMockTweetToStream(mockTweet) 

    ...verify that the mock tweet was received and processed 

}) 

Répondre

0

J'ai trouvé un moyen de le faire dans mes tests sans se moquant de l'API de streaming.

J'utilise le NPM Twitter package pour accéder à l'API de streaming Twitter comme ceci:

var client = new Twitter({ 
    consumer_key: twitterConsumerKey, 
    consumer_secret: twitterConsumerSecret, 
    access_token_key: twitterAccessTokenKey, 
    access_token_secret: twitterAccessTokenSecret 
}) 

stream = client.stream('statuses/filter', {track: 'something'}) 

stream.on('data', event => { 
    // Do some processing of incoming tweets here 
}) 

Au lieu de se moquant de l'API de streaming, je moqué l'objet client en utilisant mon propre flux avec ReWire, et mis en place une fonction pour me permettre de lui envoyer des tweets fictifs quand je veux.

const rewire = require('rewire') 
const stream = rewire('stream') 
const moduleToTest = require('somemodule') 

const mockStream = new stream.Readable() 
mockStream._read =() => {} 
mockStream.destroy =() => {} 

// Send a Tweet event to the mock stream 
function writeTweetToStream (text) { 
    mockStream.emit('data', {text: text}) 
} 

describe('Module that uses the Twitter Streaming API',() => { 
    beforeAll(() => { 
    // client.stream should return our mock stream 
    moduleToTest.__set__('client', {stream:() => { return mockStream }}) 
    }) 

    it('should process incoming tweets',() => { 
    writeTweetToStream('This is a tweet #somehashtag') 

    // Assert that the tweet was received and processed 
    }) 
})