在scala FlatSpec中断言对象实例

时间:2018-03-22 07:59:03

标签: scala scalatest matcher

我正在尝试创建更像'Scala'然后'Java'的FlatSpec测试。通常,我感兴趣的是如何断言类File的实例。

这就是我所拥有的:

File.scala

package org.demo.entries

class File(
          val parentPath: String,
          val name: String,
          val contents: String)

AssertEntries.scala

package org.demo.entries

import org.scalatest.{FlatSpec, Matchers}

object AssertEntries extends FlatSpec with Matchers{
  def assertFileEntry(expectedParentPath: String,
                      expectedName: String,
                      expectedContent: String,
                      actual: File) = {
    actual should have (
      'name (expectedName),
      'parentPath (expectedParentPath),
      'contents (expectedContent)
    )
  }
}

FileTest.scala

package org.demo.entries

import org.scalatest.{FlatSpec, Matchers}
import org.demo.entries.AssertEntries._

class FileTest extends FlatSpec with Matchers {
  val PATH1: String = "unrelated"
  val NAME1: String = "somename"
  val CONTENT1: String = "somecontent"

  "A file" should "be created" in {
    val actual : File = new File(PATH1, NAME1, CONTENT1)
    assertFileEntry(PATH1, NAME1, CONTENT1, actual)  // Is there some better approach?
  }
}

如您所见,我使用自己的assertFileEntry方法来断言文件的实例。一般来说,这种方法更像是Java,但考虑到Scala有不同的语法,我想知道,是否有一种看起来更像Scala的不同方法?

每次我想检查一个File实例时复制assertFileEntry的内容,似乎不太方便。

更新后台 为清楚起见,我省略了其余的代码。通常,File类正在扩展DirEntry类,它有两个子类型:File和Directory。目录具有包含DirEntries的附加列表。 我想通过迭代父Directory列表并调用assertFileEntry(或assertDirectoryEntry)并使用期望值断言每个条目来测试给定Directory是否包含已创建的文件(和嵌套目录)。 这就是为什么我创建assertFileEntry方法,为那里的给定File实例做所有断言的原因,但是,至少在我看来,我的解决方案似乎更像是Java然后Scala解决方案

1 个答案:

答案 0 :(得分:1)

如果有效,你的方法似乎还不错。我个人会在FileTest中创建assertFileEntry作为私有方法,如果它没有在其他地方使用,并构建这样的测试:

management:
  endpoints:
    web:
      exposure:
        include: '*'
      base-path: /actuator

有很多方法可以在Scala中做你想做的事情,所以选择一个适合你的方法。如果您的测试比这更复杂,那么在单独的测试中断言个别事情可能会更好,因此更容易找到代码的哪个部分失败。

此外,在Scala中,将package org.demo.entries import org.scalatest.{FlatSpec, Matchers} class FileSpec extends FlatSpec with Matchers { val PATH1: String = "unrelated" val NAME1: String = "somename" val CONTENT1: String = "somecontent" private def assertFileEntry(expectedParentPath: String, expectedName: String, expectedContent: String, actual: File) = { actual.name shouldBe expectedName actual.contents shouldBe expectedContent actual.parentPath shouldBe expectedParentPath } "A file" should "be created" in { val actual: File = new File(PATH1, NAME1, CONTENT1) assertFileEntry(PATH1, NAME1, CONTENT1, actual) } } 而不是{class name}Spec等测试文件命名为更常规,例如{class name}TestFileSpec超过{{1} }或ControllerSpec