首页 > 解决方案 > 使用 ScalaTest 测试 Scala 应用程序

问题描述

我一直在阅读有关 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 都很陌生,我也了解代码,但不知道从哪里开始。这只是一个非常相似的示例代码。

标签: scalascalatest

解决方案


看起来你正在寻找的是一种service1.getValue1()在你的Controller1.

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

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

如果你想使用 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/


推荐阅读