【问题标题】:Play framework model unit test播放框架模型单元测试
【发布时间】:2014-01-21 15:29:18
【问题描述】:

根据Play's documentation,(MVC)模型应该是这样的:

object MyModel {
    //code
}

您如何对此进行单元测试?在Play's unit testing documentation 中,示例模型不再定义为对象,而是定义为类。我已经构建了将模型声明为对象的应用程序,这是否意味着我现在必须更改它?

这是一个如何对控制器对象进行单元测试的示例。这个:

object MyController extends Controller {
}

必须改成这样:

trait MyController {
   //code
}

object MyController extends Controller with MyController

为了使其可单元测试,在这种情况下,单元测试将如下所示:

object MyControllerSpec extends PlaySpecification with Results {

    class TestController() extends Controller with MyController

    //unit test code

}

我必须/我可以应用相同的技术来测试我的模型(对象)吗?如果是,那怎么办?如果不是,那么唯一的方法是将所有模型作为类而不是对象?

播放框架 2.2.1

【问题讨论】:

    标签: unit-testing scala playframework playframework-2.0


    【解决方案1】:

    如果你想测试对象,而这些对象自己决定它们的依赖关系是什么以及如何与它们通信,唯一的方法就是以某种方式替换这些依赖关系,例如,对于数据库访问,它可能会提供不同的配置针对另一个数据库运行,这将要求您确保该数据库在测试运行之间保持清洁,并且不会在测试用例之间泄漏数据。它的另一个问题是它可能会使您的测试运行缓慢。

    如果您希望运行只测试一段特定代码的单元测试,那么可以使用依赖注入来实现这一点。简单依赖注入的一个示例是(与您使用控制器描述的差不多):

    class EntityDAO(db: SomeWayToTalkToADB) {
      ... defs using db ...
    }
    
    object EntityDao extends EntityDAO(Somwehere.concreteDBaccess)
    

    然后在测试中:

    "My entity dao" should {
    
      "do stuff with the db" in {
         val dao = new EntityDao(somefakeDB)
         dao.doStuff mustEqual something
      }
    }
    

    通过这种方式,您可以轻松提供假实现,例如使用 mockito 等创建的模拟。

    其他选项可能是在第二个参数列表中为每个需要它的方法提供实际的 db 访问对象,可能是隐含的以避免重复。您还可以使用 cake 模式、一些 DI 库或可能的 monad,具体取决于您想深入了解功能性内容。

    【讨论】:

    • 请注意,如果您的控制器没有它调用的任何依赖项,您不必将其拆分为特征和对象,而可以直接调用对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多