如何测试喷雾服务

How to test a spray service

查看文档似乎可以接受的做法是应在特征中定义喷雾路线,例如

trait MyService extends HttpService {
    val route = ...
}

有一些使用 Specs2RouteTest 的很好的集成测试示例,但它们似乎都触发请求并对响应执行断言。但是我如何验证该路由是否按预期与其他协作者通信?据我了解,我无法通过构造函数传递协作者,因为我正在测试特征

您可以改为将这些协作者作为特征字段传递。您还可以使用您喜欢的一些服务定位器机制 - 查找您的服务的东西。

基本上你的问题是关于依赖注入 DI 并且可能在测试中模拟这些依赖。

我使用 Spray 的方法是使用 Cake 模式将这些依赖项定义为特征字段,当您将蛋糕放在最后一层时 overrides/provides 这些依赖项。

看看这个例子:https://github.com/izmailoff/Spray_Mongo_REST_service

这是一个使用那个蛋糕的测试: https://github.com/izmailoff/Spray_Mongo_REST_service/blob/master/rest/src/test/scala/com/example/service/GetTweetSpec.scala

这是帮助程序 class 将蛋糕与模拟数据库放在一起进行测试: https://github.com/izmailoff/Spray_Mongo_REST_service/blob/master/rest/src/test/scala/com/example/test/utils/db/ServiceTestContext.scala

这里是 non-test/prod 的文件,它们组成了蛋糕: https://github.com/izmailoff/Spray_Mongo_REST_service/tree/master/rest/src/main/scala/com/example/service

特别是: https://github.com/izmailoff/Spray_Mongo_REST_service/blob/master/rest/src/main/scala/com/example/service/RestServiceHandler.scala

它可能需要一些清理,但你可以理解这个想法。