Рубиновые предупреждения пойти $stderr
, так что вы можете обернуть его с объектом, который шпионит предупреждения, написанные на ней:
В спецификации/поддержки/warning_spying_stderr.rb:
require 'delegate'
class WarningSpyingIO < SimpleDelegator
attr_reader :strings
def initialize(delegate)
@strings = []
super
end
def write(string)
if string.include? 'warning: ' # in case anything other than a Ruby warning goes to $stderr
@strings << string
end
__getobj__.write string
end
end
$stderr = WarningSpyingIO.new $stderr
В спецификация/warning_spec.rb:
describe "My code" do
it "has no warnings" do
FOO = 'foo'
FOO = 'bar'
expect($stderr.strings).to be_empty
end
end
спецификация терпит неудачу с
expected `[
"spec/warning_spec.rb:4: warning: already initialized constant FOO\n",
"spec/warning_spec.rb:3: warning: previous definition of FOO was here\n"
].empty?` to return true, got false
Я поставил линию, которая генерирует предупреждение теста в спецификации для удобства, но он должен работать одинаково хорошо для любого предупреждения, выданного после $stderr
угнали.
я не встретил необходимость прекратить слежку, прежде чем RSpec вышел, но если вы делаете вы можете сделать
$stderr = $stderr.__getobj__
в точке, в которой вы хотите, чтобы остановить слежку.