2017-05-25 73 views
2

我有一個連接到Twitter REST和流式API的Node應用程序。爲了測試代碼,使請求的REST API,我可以用諾克攔截HTTP請求並返回模擬數據,像這樣:如何將請求中的模擬數據返回給節點中的Twitter Streaming API

var nock = require('nock') 

var mockData = [...] 

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

我的應用程序還可以連接到流API端點statuses/filter並進行一些分析在通過流媒體API接收的推文上。 In Nock's README它聲明你可以傳遞一個函數給.query()返回一個流,但是我還沒有能夠得到這個工作。

如何使用Nock(或其他庫,如果需要)將請求中的模擬數據返回到此端點?我非常希望能夠發送鳴叫流在我的測試,每當我需要,例如:

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

    sendMockTweetToStream(mockTweet) 

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

}) 

回答

0

我已經找到一種方法來做到這一點在我的測試沒有嘲笑流API。

我使用NPM Twitter package訪問Twitter的流API,像這樣:

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 
}) 

而不是嘲諷流API,我用我自己的流與ReWire的嘲笑client對象,並設置了功能讓我隨時隨地發送模擬推文。

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 
    }) 
}) 
相關問題