scala - 使用 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 都很陌生,我也了解代码,但不知道从哪里开始。这只是一个非常相似的示例代码。
解决方案
看起来你正在寻找的是一种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/
推荐阅读
- javascript - 立即可调用函数表达式的意义何在?
- c# - 在 C# 中将图像转换为视频时,如何增加视频的长度(运行时间)?
- linux - 使用变量替换为 sed 并添加
- json - 将 JSON 构建为数组元素
- visual-studio-code - 在 VS Code 中/从 VS Code 启动/测试 VS Emulator for Android
- android - 在 Android Studio 中通过 Glide 加载图像
- html - 在这个特定示例中,如何使跨度覆盖 div 的整个宽度?
- netsuite - Netsuite:如何将自定义链接添加到导航栏或标题
- excel - 收到有关应用程序定义或对象定义错误的错误
- sockets - uwsgi 总是绑定到 80 端口。即使配置为不