Cú pháp mong đợi để kiểm tra thông báo ngoại lệ trong khẳng định_raises / must_raise của MiniTest là gì?


Câu trả lời:


150

Bạn có thể sử dụng assert_raiseskhẳng định hoặc must_raisekỳ 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

Tuyệt, tôi hiểu rồi. Tuy nhiên, tôi vẫn chưa biết cách xác nhận thông báo lỗi đã nêu.
kfitzpatrick

3
err = -> {bar.do_it} .must_raise Cú pháp RuntimeError không hoạt động với tôi, Nó tiếp tục đưa ra ngoại lệ sau. NoMethodError: Phương pháp xác định 'assert_raises' cho nil: NilClass
thanikkal

2
@thanikkal Hãy chắc chắn rằng bạn đang sử dụng Minitest::Specvà không Minitest::Test. Spec DSL, bao gồm cả mong đợi, chỉ khả dụng khi sử dụng Minitest::Spec.
blowmage

28

Để 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_raisestrả 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)

7

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::TestCaselớ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

2
Đúng là Minitest không hỗ trợ kiểm tra thông báo lỗi, tuy nhiên, bạn có thể kiểm tra thông báo lỗi bằng cách sử dụng must_raisevì 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.
bithavoc

1
Giải pháp này cảm thấy tốt hơn đối với tôi, nhưng tôi đã không sử dụng must_raisetrước đây.
pumazi

Tôi nghĩ rằng giải pháp này sẽ không thất bại nếu không có Ngoại lệ nào raisen. Bạn chỉ cần kiểm tra ngoại lệ được nêu ra là ngoại lệ chính xác. Nhưng nếu không nêu ra ngoại lệ thì không có khẳng định nào được thực hiện => không có lỗi.
Foton

điểm tốt @Foton Tôi đã thay đổi câu trả lời để phản ánh kỳ vọng đó.
Nhà phát triển

0

Để 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_messagevà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_messagemà 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.