如何将请求中的模拟数据返回到Node中的Twitter Streaming API

我有一个连接到Twitter REST和stream媒体API的Node应用程序。 为了testing向REST API发出请求的代码,我可以使用Nock拦截HTTP请求并返回模拟数据,如下所示:

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

我的应用程序还连接到stream媒体API端点状态/filter,并对通过stream式API接收的推文执行一些分析。 在Nock的README中,它声明你可以传递一个函数给.query()返回一个stream,但是我一直无法得到这个工作。

如何使用Nock(或其他库,如果有必要)从请求返回模拟数据到这个端点? 理想情况下,我希望能够在我的testing中随时发送推文到stream中,例如:

 it('should correctly process tweets coming in on the streaming API', () => { var mockTweet = {...} sendMockTweetToStream(mockTweet) ...verify that the mock tweet was received and processed }) 

我已经find了一种方法在我的testing中做到这一点,而不嘲笑stream媒体API。

我正在使用NPM Twitter包来访问Twitterstream媒体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 }) 

我没有嘲笑stream媒体API,而是使用我自己的rewirestream来嘲笑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 }) })