【问题标题】:How to test a spray service如何测试喷涂服务
【发布时间】:2015-07-23 10:57:00
【问题描述】:

查看文档似乎已被接受的做法是,应该在 trait 中定义喷洒路线,例如

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

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

【问题讨论】:

  • 那么如何访问这些合作者?是MyService 子类的最终实现部分吗?它们是否暗示您必须在范围内?还有什么我现在没有想到的?

标签: scala spray


【解决方案1】:

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

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

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

看看这个例子: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

这是一个帮助类,它将蛋糕与模拟 DB 放在一起进行测试: https://github.com/izmailoff/Spray_Mongo_REST_service/blob/master/rest/src/test/scala/com/example/test/utils/db/ServiceTestContext.scala

以下是将蛋糕放在一起的非测试/产品文件: 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

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

【讨论】:

  • 谢谢,我更喜欢依赖于服务定位器模式的特征的想法(我最后一次在 Java 领域使用它是在 2004 年!)
  • 我也不喜欢服务定位器——通常它太重了,不得不提到它作为蛋糕模式的替代品之一;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多