scala specs2。等于检查依赖于toString

时间:2013-06-04 02:07:37

标签: unit-testing scala tostring specs2

此测试没问题,因为我明确使用toString

"have one sentence by '...'" in {

  val text1 = Text("some text...")
  text1.sentences must have size(1)

  text1.sentences(0).toString must_== "some text"
}

如果没有toSting测试,则会失败,并显示以下消息:

Expected :some text
Actual   :some text

java.lang.Exception: 'some text: dictionary.Sentence' is not equal to 'some text: java.lang.String'
  

我理解它的感觉(总的来说),但是因为toString是   无论如何调用它不应该检查字符串到字符串呢?

     

将此测试写成简洁的最佳方法是什么?不使用   直接toString

1 个答案:

答案 0 :(得分:1)

我认为您可能会混淆toStringequals。当你说出你想说的话时:

text1.sentences(0) must_== "some text"

你真正说的是:

text1.sentences(0).equals("some text") must beTrue

如果你希望这个工作,那么你需要在equals类上有一个Sentence函数,它使用句子的toString来与传入的对象进行比较(在这种情况下为String。一个简单的规范显示可能如下所示:

class Sentence(text:String){
  override def equals(obj:Any) = {
    this.toString == obj.toString
  }
  override def toString = text
}

class EqualitySpec extends Specification{
  "A sentence" should{
    "be equal to plain text" in {
      val sentence = new Sentence("hello world")
      sentence must be_==("hello world")
    }
  } 
}

现在,如果Sentence类是您自己的类,这会很有效。如果它在第三方库中并且您无法控制equals函数,那么您可能会遇到它们的问题。