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



我有一个连接到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 终结点状态/筛选器,并对通过流式处理 API 接收的推文执行一些分析。在 Nock 的自述文件中,它指出您可以将一个函数传递给返回流的.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
})

我已经找到了一种方法可以在我的测试中做到这一点,而不会嘲笑流式处理 API。

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

最新更新