Как вернуть фиктивные данные из запросов к API потоковой передачи Twitter в Node

У меня есть приложение Node, которое подключается к Twitter REST и API потоковой передачи. Чтобы протестировать код, который делает запросы к 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. В 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

})

person linuxuser    schedule 25.05.2017    source источник


Ответы (1)


Я нашел способ сделать это в своих тестах, не высмеивая потоковый API.

Я использую пакет NPM Twitter для доступа к API потоковой передачи Twitter следующим образом:

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, я издевался над объектом client, используя свой собственный поток с rewire, и настроил функцию, позволяющую мне отправлять ему фиктивные твиты, когда я хочу.

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
  })
})
person linuxuser    schedule 29.05.2017