Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 如何在测试脚本中检查Hubot日志输出_Testing_Logging_Coffeescript_Mocha.js_Hubot - Fatal编程技术网

Testing 如何在测试脚本中检查Hubot日志输出

Testing 如何在测试脚本中检查Hubot日志输出,testing,logging,coffeescript,mocha.js,hubot,Testing,Logging,Coffeescript,Mocha.js,Hubot,我正在为我的Hubot编写一个测试(它充当Slack机器人)。由某些松弛消息触发,bot向单独的Rails应用程序发送HTTP POST请求。如何在测试脚本中检查HTTP请求是否已发送?我的猜测是,我应该检查robot.logger的内容(请告诉我是否有更好的方法)-但是如果有,我如何在测试中访问日志 Hubot脚本(基本上,它会通知Rails应用程序某个用户离开办公室休息): module.exports=(机器人)-> robot.response/off to午餐/i(res)-> res

我正在为我的Hubot编写一个测试(它充当Slack机器人)。由某些松弛消息触发,bot向单独的Rails应用程序发送HTTP POST请求。如何在测试脚本中检查HTTP请求是否已发送?我的猜测是,我应该检查
robot.logger
的内容(请告诉我是否有更好的方法)-但是如果有,我如何在测试中访问日志

Hubot脚本(基本上,它会通知Rails应用程序某个用户离开办公室休息):

module.exports=(机器人)->
robot.response/off to午餐/i(res)->
res.reply(“后来的鳄鱼”)
robot.logger.info“此用户正在午休:{res.message.user.id}”
data=JSON.stringify({
slack\u user\u id:res.message.user.id
})
http(process.env.RAILS\u APP\u URL+'/break')
.header('Content-Type','application/json')
.post(数据)(错误、响应、正文)->
如果出错
robot.logger.info“遇到错误。#{err}”
res.reply('抱歉,记录您的休息时间时出错')
其他的
robot.logger.info“已成功向Rails应用程序发送HTTP POST请求”
执行此脚本时记录输出:

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
INFO此用户正在午休:[SLACK\u user\u ID]
INFO已成功将HTTP POST请求发送到Rails应用程序
如上所述,我想在测试脚本中检查HTTP请求是否已发送,方法是断言日志将包含消息
“已成功将HTTP POST请求发送到Rails应用程序”
。然而,我不知道如何在我的测试中访问Hubot的日志。我认为它与进程.stdout有关,因为bot登录到stdout,但我无法让它工作

测试脚本:

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
Helper=require('hubot-test-Helper')
helper=new helper(“../scripts/break start.coffee”)
请求=要求('请求')
expect=require('chai')。expect
nock=require('nock')
描述“机器人响应用户消息并发送”,->
每次之前->
#在运行测试之前设置好房间。
@room=helper.createRoom()
#设置请求拦截器。
nock(process.env.RAILS\u APP\u URL)
.post('/break',{slack_user_id:'bob'})
.答复(200)
每次之后->
#测试结束后拆掉房间,让听者自由。
@破坏房间
上下文“用户发送午餐消息”,->
每次之前->
@room.user.say('bob','hubot出去吃午饭')
它“响应外出午餐的用户”,->
expect(@room.messages).to.eql[
['bob','@hubot出去吃午饭']
['hubot','bob Later alligator']
#我想这样做:
#expect(robot.log).include('已成功向Rails应用程序发送HTTP POST请求')
当然,当我运行测试时,我可以在控制台日志中看到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

提前感谢您的帮助。

我不建议您根据日志编写测试。日志是程序的副作用。如果更改日志输出,测试将失败,即使功能仍然正确

相反,您应该使用库模拟并检查是否执行了http请求。实际发出请求会产生副作用,并且不应该在您的测试中执行(如果由于测试运行而导致外部服务负载过大,该怎么办

您已经在使用
nock
库捕获请求。它还可用于检查请求是否已发出(请参阅来自nock repo的)

下面是一个在测试中使用nock中的
requestScope.done()
的示例

it 'sends the break request to the rails server', ->
  # capture the request to the rails app
  railsRequest = nock(process.env.RAILS_APP_URL)
    .post('/break', { slack_user_id: 'bob' })
    .reply(200)
  # make the request and wait for it to be completed
  await @room.user.say('bob', '@hubot Off to lunch')
  # check that the request was made
  railsRequest.done()
我正在使用
wait
来确保应该发出请求的函数调用在测试它之前完成。如果您不熟悉
wait
,可以将检查(
railsRequest.done()
)移动到
中。然后()
@room.user上的promise处理程序中。改为说(…)
调用


承诺版本: 关于您的评论,这里是promisified版本。您需要传递
。然后
一个函数。如果传递它
。然后request.done()
,则会立即执行
request.done()
期望,其结果将作为promise回调传递。或者将其包装在另一个函数中(请参见下文)或者删除括号(
.then request.done
)。但请注意第二个选项。如果您的承诺返回一个值,这将传递给回调。由于它来自库,这可能会导致意外行为-这就是我建议第一个选项的原因:

it 'sends the break request to the rails server', ->
  # capture the request to the rails app
  railsRequest = nock(process.env.RAILS_APP_URL)
    .post('/break', { slack_user_id: 'bob' })
    .reply(200)
  # make the request and wait for it to be completed
  @room.user.say('bob', '@hubot Off to lunch').then ->
    # check that the request was made
    railsRequest.done()

谢谢您的回复。我认为使用
await
需要一个关键字为
async
的函数。因为没有
async
,所以您建议的代码返回了
ReferenceError:await没有定义。
。这里有没有办法使用
async/await
呢?我也尝试过使用
。然后
承诺,一个然后(@railsRequest.isDone())
。但是如果我把
isDone()
换成
done()
,我会得到一个
AssertionError
Mocks还不满意
。我不确定为什么即使我读了这篇文章,因为区别似乎很明显“所有指定呼叫与单个呼叫”,但这里只有一个模拟开始。对于多个问题,非常抱歉,再次感谢!