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.