Тест для предупреждений с использованием RSpec
Можно ли как-то проверить предупреждения в Ruby с помощью RSpec?
Как это:
class MyClass
def initialize
warn "Something is wrong"
end
end
it "should warn" do
MyClass.new.should warn("Something is wrong")
end
4 ответа
warn
определяется в Kernel
, который входит в каждый объект. Если вы не выдавали предупреждение во время инициализации, вы можете указать следующее предупреждение:
obj = SomeClass.new
obj.should_receive(:warn).with("Some Message")
obj.method_that_warns
Spec'ing предупреждение, поднятое в initialize
метод довольно сложный. Если это должно быть сделано, вы можете поменяться подделкой IO
объект для $stderr
и осмотреть это. Просто обязательно восстановите его после примера
class MyClass
def initialize
warn "Something is wrong"
end
end
describe MyClass do
before do
@orig_stderr = $stderr
$stderr = StringIO.new
end
it "warns on initialization" do
MyClass.new
$stderr.rewind
$stderr.string.chomp.should eq("Something is wrong")
end
after do
$stderr = @orig_stderr
end
end
Есть хорошая статья с пользовательским ожиданием, которая решает именно вашу проблему: http://greyblake.com/blog/2012/12/14/custom-expectations-with-rspec/
Так что хотелось бы:
expect { MyClass.new }.to write("Something is wrong").to(:error)
Основываясь на этой статье, вы можете создать свое собственное ожидание использовать его следующим образом:
expect { MyClass.new }.to warn("Something is wrong")
Если во время инициализации возникает предупреждение, вы можете использовать ожидание вывода:
expect do
described_class.new
end.to output('test message').to_stderr
Это мое решение, я определяю пользовательское совпадение has_warn
require 'rspec'
require 'stringio'
module CustomMatchers
class HasWarn
def initialize(expected)
@expected = expected
end
def matches?(given_proc)
original_stderr = $stderr
$stderr = StringIO.new
given_proc.call
@buffer = $stderr.string.strip
@expected.include? @buffer.strip
ensure
$stderr = original_stderr
end
def supports_block_expectations?
true
end
def failure_message_generator(to)
%Q[expected #{to} get message:\n#{@expected.inspect}\nbut got:\n#{@buffer.inspect}]
end
def failure_message
failure_message_generator 'to'
end
def failure_message_when_negated
failure_message_generator 'not to'
end
end
def has_warn(msg)
HasWarn.new(msg)
end
end
Теперь вы можете использовать эту функцию следующим образом после включения CustomMatchers:
expect{ MyClass.new }.to has_warn("warning messages")