Cú pháp mong đợi để kiểm tra thông báo ngoại lệ trong assert_raises
/ của MiniTest là must_raise
gì?
Tôi đang cố gắng xác nhận một cái gì đó như sau, đâu "Foo"
là thông báo lỗi dự kiến:
proc { bar.do_it }.must_raise RuntimeError.new("Foo")
Cú pháp mong đợi để kiểm tra thông báo ngoại lệ trong assert_raises
/ của MiniTest là must_raise
gì?
Tôi đang cố gắng xác nhận một cái gì đó như sau, đâu "Foo"
là thông báo lỗi dự kiến:
proc { bar.do_it }.must_raise RuntimeError.new("Foo")
Câu trả lời:
Bạn có thể sử dụng assert_raises
khẳng định hoặc must_raise
kỳ vọng.
it "must raise" do
assert_raises RuntimeError do
bar.do_it
end
-> { bar.do_it }.must_raise RuntimeError
lambda { bar.do_it }.must_raise RuntimeError
proc { bar.do_it }.must_raise RuntimeError
end
Nếu bạn cần kiểm tra điều gì đó trên đối tượng lỗi, bạn có thể lấy nó từ xác nhận hoặc kỳ vọng như sau:
describe "testing the error object" do
it "as an assertion" do
err = assert_raises RuntimeError { bar.do_it }
assert_match /Foo/, err.message
end
it "as an exception" do
err = ->{ bar.do_it }.must_raise RuntimeError
err.message.must_match /Foo/
end
end
Minitest::Spec
và không Minitest::Test
. Spec DSL, bao gồm cả mong đợi, chỉ khả dụng khi sử dụng Minitest::Spec
.
Để khẳng định ngoại lệ:
assert_raises FooError do
bar.do_it
end
Để xác nhận thông báo ngoại lệ:
Theo tài liệu API , assert_raises
trả về ngoại lệ phù hợp để bạn có thể kiểm tra thông báo, thuộc tính, v.v.
exception = assert_raises FooError do
bar.do_it
end
assert_equal('Foo', exception.message)
Minitest không cung cấp (chưa) cho bạn một cách để kiểm tra thông báo ngoại lệ thực tế. Nhưng bạn có thể thêm một phương thức trợ giúp thực hiện điều đó và mở rộng ActiveSupport::TestCase
lớp để sử dụng ở mọi nơi trong bộ thử nghiệm rails của bạn, ví dụ: trongtest_helper.rb
class ActiveSupport::TestCase
def assert_raises_with_message(exception, msg, &block)
block.call
rescue exception => e
assert_match msg, e.message
else
raise "Expected to raise #{exception} w/ message #{msg}, none raised"
end
end
và sử dụng nó trong các thử nghiệm của bạn như:
assert_raises_with_message RuntimeError, 'Foo' do
code_that_raises_RuntimeError_with_Foo_message
end
must_raise
vì nó cung cấp cho bạn trường hợp lỗi để bạn có thể tự kiểm tra thông báo.
must_raise
trước đây.
Để thêm một số phát triển gần đây, đã có một số cuộc thảo luận về việc thêm assert_raises_with_message
vào minitest trong quá khứ mà không có nhiều may mắn.
Hiện tại, có một yêu cầu kéo đầy hứa hẹn đang chờ được hợp nhất. Nếu và khi nó được hợp nhất, chúng tôi sẽ có thể sử dụng assert_raises_with_message
mà không cần phải tự định nghĩa nó.
Trong khi đó, có một viên ngọc nhỏ tiện dụng này có tên minitest-bonus-khẳng định xác định chính xác phương thức đó, cùng với một số phương thức khác, để bạn có thể sử dụng nó ngay lập tức. Xem tài liệu để biết thêm thông tin.