2017-05-25 76 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 
    }) 
}) 
相关问题