使用 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/
我一直在阅读有关 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/