ScalaTest'te özel hata mesajları nasıl gösterilir?


88

ScalaTest'te özel bir hata mesajının nasıl gösterileceğini bilen var mı?

Örneğin:

NumberOfElements() should equal (5)

Başarısız olduğunda aşağıdaki mesajı gösterir:

10 eşit değildi 5

Ama şöyle daha açıklayıcı bir mesaj istiyorum:

NumberOfElements 5 olmalıdır.

Yanıtlar:


104

Böyle bir özelliği ilk soran sizsiniz. Bunu başarmanın bir yolu withClue'dur. Gibi bir şey:

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

Bu size şu hata mesajını almalı:

NumberOfElements: 10, 5'e eşit değildi

Mesajı tamamen kontrol etmek istiyorsanız, özel bir eşleştirici yazabilirsiniz. Ya da şöyle bir iddia kullanabilirsiniz:

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

Kullanım durumunuzun ne olduğunu açıklar mısınız? Neden 10 eşit değil 5 neden yeterli değil ve bu ihtiyacın ne kadar sık ​​gerçekleşiyor?

İşte istediğin türden şeyler:

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)

Yani bu şekilde yazabilirsiniz:

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

1
Bir it () testine birden fazla iddia koymam gereken ve birden fazla tam sayı karşılaştırması olduğu durumlar var. Hangi iddianın başarısız olduğu günlüklere bakarak net değil.
— Udayakumar Rayala

Ancak bunu belirtmenin withClue yolu okunabilir değildir. Sonunda mesajı belirtmenin bir yolu yok mu?
— Udayakumar Rayala

1
Sonunda eşleştiricinin DSL ile yapılamaz, ancak withClue parametrelerini ters sıraya koyan bir yöntem yazabilirsiniz. Cevaba bir örnek ekleyeceğim.
— Bill Venners

13

2011'den beri yeni yöntem: Matchersve AppendedClue1 özellik. Ayrıca, koleksiyon boyutları için bazı varsayılan mesajlar vardır.

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
      }
    }
  }
}

Çıktı şuna benzer:

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)

ListUzun .toStringçıktılı listeler için boyut mesajının harika olmadığını unutmayın .

Daha fazla bilgi için scaladoc'a bakın .


1AppendedClues Özelliğin bu sorudan ilham aldığını tahmin ediyorum , kabul edilen cevabın Bill Venners bu özelliğin yazarıdır.


2

Ayrıca withClueherhangi bir şeyi içe aktarmadan veya test sınıfına eklemeden de kullanabilirsiniz :

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

Bu, Assertionssınıftan içe aktarılır :org.scalatest.Assertions#withClue


Bu, kabul edilen cevaba ne ekler?
— tilde
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.