【问题标题】:How do I return mock data from requests to the Twitter Streaming API in Node如何将模拟数据从请求返回到 Node 中的 Twitter 流 API
【发布时间】:2017-10-25 15:50:16
【问题描述】:

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

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

})

【问题讨论】:

    标签: javascript node.js twitter twitter-streaming-api nock


    【解决方案1】:

    我在测试中找到了一种无需模拟流 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
      })
    })
    

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 2018-12-02
      • 2017-10-01
      • 2012-08-19
      • 2019-01-25
      • 2012-06-19
      • 2019-12-21
      • 1970-01-01
      相关资源
      最近更新 更多