Я пишу тест для моего Hubot (который действует как Slack-бот). Вызванный определенными сообщениями Slack, бот отправляет HTTP-запрос POST в отдельное приложение Rails. Как я могу проверить в своем тестовом скрипте, что HTTP-запрос был отправлен? Я предположил, что я должен проверить содержимое robot.logger
(пожалуйста, дайте мне знать, если есть лучший способ) - но если так, как я могу получить доступ к журналу в тесте?
Скрипт Hubot (в основном, он сообщает приложению Rails о пользователе, который покидает офис, чтобы отдохнуть):
module.exports = (robot) ->
robot.respond /off to lunch/i, (res) ->
res.reply('Later alligator')
robot.logger.info "This user is going on lunch break: #{res.message.user.id}"
data = JSON.stringify({
slack_user_id: res.message.user.id
})
robot.http(process.env.RAILS_APP_URL + '/break')
.header('Content-Type', 'application/json')
.post(data) (err, resp, body) ->
if err
robot.logger.info "Encountered an error. #{err}"
res.reply('Sorry, there was an error recording your break time')
else
robot.logger.info 'Successfully sent HTTP POST request to Rails app'
Вывод журнала при выполнении этого скрипта:
INFO This user is going on lunch break: [SLACK_USER_ID]
INFO Successfully sent HTTP POST request to Rails app
Как я упоминал выше, я хотел бы проверить в своем тестовом скрипте, что HTTP-запрос был отправлен, утверждая, что в журнал будет включено сообщение 'Successfully sent HTTP POST request to Rails app'
. Тем не менее, я не знаю, как получить доступ к журналу Hubot в моем тесте. Я думал, что это как-то связано с process.stdout
, потому что бот регистрируется на stdout, но я не мог заставить его работать.
Тестовый скрипт:
Helper = require('hubot-test-helper')
helper = new Helper('../scripts/break-start.coffee')
request = require('request')
expect = require('chai').expect
nock = require('nock')
describe 'bot responds to user message and sends ', ->
beforeEach ->
# Set up the room before running the test.
@room = helper.createRoom()
# Set up a request interceptor.
nock(process.env.RAILS_APP_URL)
.post('/break', { slack_user_id: 'bob' })
.reply(200)
afterEach ->
# Tear down the room after the test to free up the listener.
@room.destroy()
context 'user sends lunch message', ->
beforeEach ->
@room.user.say('bob', '@hubot Off to lunch')
it 'responds to users who are off to lunch', ->
expect(@room.messages).to.eql [
['bob', '@hubot Off to lunch']
['hubot', '@bob Later alligator']
# I want to do something like this:
# expect(robot.log).include('Successfully sent HTTP POST request to Rails app')
Конечно, при запуске теста я вижу в журнале консоли, что HTTP-запрос отправляется, но я также хотел бы подтвердить его, чтобы тест не прошел, если запрос не отправлен.
Вывод журнала при выполнении теста:
INFO This user is going on lunch break: bob
✓ responds to users who are off to lunch
INFO Successfully sent HTTP POST request to Rails app
Заранее благодарю за любую помощь.