Làm cách nào để hiển thị thông báo lỗi tùy chỉnh trong ScalaTest?


86

Có ai biết cách hiển thị thông báo lỗi tùy chỉnh trong ScalaTest không?

Ví dụ:

NumberOfElements() should equal (5)

Hiển thị thông báo sau khi nó không thành công:

10 không bằng 5

Nhưng tôi muốn thông báo mô tả nhiều hơn như:

NumberOfElements phải là 5.

Câu trả lời:


101

Bạn là người đầu tiên yêu cầu một tính năng như vậy. Một cách để đạt được điều này là với withClue. Cái gì đó như:

withClue("NumberOfElements: ") { NumberOfElements() should be (5) }

Điều đó sẽ khiến bạn nhận được thông báo lỗi này:

NumberOfElements: 10 không bằng 5

Nếu bạn muốn kiểm soát hoàn toàn tin nhắn, bạn có thể viết một trình đối sánh tùy chỉnh. Hoặc bạn có thể sử dụng một khẳng định, như sau:

assert(NumberOfElements() == 5, "NumberOfElements should be 5")

Bạn có thể nói rõ về trường hợp sử dụng của bạn là gì không? Tại sao 10 không bằng 5 là không đạt, và bạn có nhu cầu này thường xuyên không?

Đây là loại thứ bạn đang yêu cầu:

scala> import org.scalatest.matchers.ShouldMatchers._
import org.scalatest.matchers.ShouldMatchers._

scala> withClue ("Hi:") { 1 + 1 should equal (3) }
org.scalatest.TestFailedException: Hi: 2 did not equal 3
at org.scalatest.matchers.Matchers$class.newTestFailedException(Matchers.scala:150)
at org.scalatest.matchers.ShouldMatchers$.newTestFailedException(ShouldMatchers.scala:2331)


scala> class AssertionHolder(f: => Any) {
     |   def withMessage(s: String) {
     |     withClue(s) { f }
     |   }
     | }
defined class AssertionHolder

scala> implicit def convertAssertion(f: => Any) = new AssertionHolder(f)
convertAssertion: (f: => Any)AssertionHolder

scala> { 1 + 1 should equal (3) } withMessage ("Ho:")
org.scalatest.TestFailedException: Ho: 2 did not equal 3
at org.scalatest.matchers.Matchers$class.newTestFailedException(Matchers.scala:150)
at org.scalatest.matchers.ShouldMatchers$.newTestFailedException(ShouldMatchers.scala:2331)

Vì vậy, theo cách này bạn có thể viết:

{ NumberOfElements() should be (5) } withMessage ("NumberOfElements:")

1
Có những tình huống mà tôi phải đặt nhiều hơn một khẳng định trong một bài kiểm tra it () và có nhiều hơn một phép so sánh số nguyên. Không rõ bằng cách nhìn vào nhật ký xác nhận nào đã thất bại.
Udayakumar Rayala

Nhưng cách xác định withClue không thể đọc được. Không có cách nào để xác định thông báo ở cuối?
Udayakumar Rayala

1
Ở phần cuối, không thể thực hiện được với DSL của trình khớp, nhưng bạn có thể viết một phương thức đặt các tham số withClue theo thứ tự ngược lại. Tôi sẽ thêm một ví dụ cho câu trả lời.
Bill Venners

12

Cách mới kể từ năm 2011: MatchersAppendedCluecác đặc điểm. Ngoài ra, đối với kích thước bộ sưu tập, có một số thông báo mặc định.

import org.scalatest.{AppendedClues, Matchers, WordSpec}

class SomeTest extends WordSpec with Matchers with AppendedClues {

  "Clues" should {
    "not be appended" when {
      "assertions pass" in {
        "hi" should equal ("hi") withClue "Greetings scala tester!"
      }
    }
    "be appended" when {
      "assertions fail"  in {
        1 + 1 should equal (3) withClue ", not even for large values of 1!"
      }
    }
    "not be needed" when {
      "looking at collection sizes" in {
        val list = List(1, 2, 3)
        list should have size 5
      }
    }
  }
}

Đầu ra giống như sau:

SomeTest:
Clues
  should not be appended
  - when assertions pass
  should be appended
  - when assertions fail *** FAILED ***
    2 did not equal 3, not even for large values of 1! (SomeTest.scala:15)
  should not be needed
  - when looking at collection sizes *** FAILED ***
    List(1, 2, 3) had size 3 instead of expected size 5 (SomeTest.scala:21)

Lưu ý rằng Listthông báo kích thước không phù hợp với các danh sách có .toStringđầu ra dài .

Xem scaladoc để biết thêm thông tin.


3

Bạn cũng có thể sử dụng withCluemà không cần nhập bất kỳ thứ gì hoặc thêm nó vào lớp thử nghiệm:

withClue(s"Expecting distinct elements: ${elements.toList}") { elements.length shouldBe 3 }

Điều này được nhập từ Assertionslớp:org.scalatest.Assertions#withClue

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.