我有一个机架应用程序(特别是Sinatra的应用程序,但我认为不重要),当正常运行时,它会愉快地向STDOUT输出一些关于它的请求的信息,例如:
127.0.0.1 - - [25/Jul/2013 10:05:39] "GET /oath2/token?password=ohnoes HTTP/1.1" 404 507 0.0013
我正在尝试编写Rack::CommonLogger
的扩展名,该扩展名将从日志文件中删除密码,因此我的第一个任务当然是编写测试。
我rack/test
设置了rspec
,但我无法弄清楚如何捕获传出日志,以便我可以扫描其中的内容!有什么想法吗?
require 'my_webapp'
describe "My Webapp" do
include Rack::Test::Methods
def app
@app ||= MyWebapp.new
end
it 'should not log the text of any GET password parameter' do
get '/oauth2/token?password=ohnoes'
# Not sure about this!
log_output.should_not =~ /ohnoes/
end
end
答案 0 :(得分:1)
您需要对自定义记录器调用其输出的任何方法存根并设置期望。
因此,例如,如果您的自定义记录器使用单个参数直接写入STDERR
,您将使用:
STDERR.stub(:write) {|arg| expect(arg).to_not match(/password/)}
如果您的自定义记录器写入默认记录器(即env['rack.errors']
)而不是STDERR,那么您将存根该对象的write
方法。我会展示这个例子,但我无法弄清楚如何在RSpec测试中掌握Rack环境。
关于此实施的几点说明:
any_number_of_times
,如
{$ 1}}已被弃用
赞成STDERR.should_receive(:write).any_number_of_times
stub