使用 ScalaTest 测试 Scala 应用程序

Testing a Scala Aplication with ScalaTest

我一直在阅读有关 ScalaTest 的文档,但能够弄清楚我应该采用哪种类型的方法来测试应用程序。

代码分为控制器和服务。 例如。控制器代码示例

@Singleton
class Controller1 @Inject()(service1: ServiceClass1, authAction : AuthAction)
    extends InjectedController {
//returns a list[]
  def getSomeValue() = authAction {
    val res = service1.getValue1()
    val json = Json.toJson(res)
    Ok(json)
  }
}

服务代码示例 -:

def getValue1() = {
    implicit val graph = db.g

    val infos = graph.V.hasLabel[someModel].toList()
    infos.map(vertex => {
      val someModel = vertex.toCC[someModel]
      val item = info(someId =
                              someModel.someId.getOrElse("").toString,
                            category = SomeModel.category,
                            description = someModel.description)
      item
    })
  }

我对测试和 Scala 都很陌生,我也理解代码但无法理解从哪里开始。 这只是一个非常相似的示例代码。

您正在寻找的似乎是一种在 Controller1.

中模拟 service1.getValue1() 的方法

Scalatest 支持几种不同的方式来做到这一点:http://www.scalatest.org/user_guide/testing_with_mock_objects

在你的情况下,测试def getSomeValue();您需要定义一个模拟并设置正确的期望,以便在从测试中调用时,模拟 returns 预期的响应。

如果您想使用 scala mock,您需要将其添加为 sbt 构建配置中的依赖项。您可以通过将此依赖项添加到您的测试来做到这一点:

  "org.scalamock" %% "scalamock" % "4.4.0" % Test

然后,你的测试可能是这样的:

import org.scalamock.scalatest.MockFactory
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class Controller1Spec extends AnyFlatSpec with Matchers with MockFactory {
  "Controller1" should "respond with a valid response" in {
    val mockService = mock[ServiceClass1]
    (mockService.getValue1 _).when().returning("Some Response").once()

    val mockAuthAction = mock[AuthAction] //assuming you've got an action called AuthAction
    //you'd need to mock this one too, in order for it to work
    (mockAuthAction.invokeBlock _) expects(_) onCall((r,b) => b(r))

    new Controller1(mockService, mockAuthAction) shouldBe Ok("Some Response")
  }
}

有很多关于 Scala 模拟的帖子,您应该可以找到,就像这里的这篇帖子:https://scalamock.org/user-guide/advanced_topics/