模拟对象在游戏中[2.0]

Jac*_*ter 8 testing dependency-injection scala playframework playframework-2.0

我想通过在测试期间提供模拟对象来测试我的Play应用程序.在我的头顶,有几种方法可以解决这个问题.

  1. 在测试期间提供备用路径文件
  2. 使用依赖注入,并在运行时检查全局值

我不确定哪个更可行,或者如何去做.任何见解将不胜感激.

Bla*_*son 13

还有第三种方式; 将控制器创建为用于测试的类或特征.这是一个简单的例子.

你的特质+实施:

package services

trait MyService {
  def getUser(id:String):User
}

class ConcreteService extends MyService {
  override def getUser(id:String):User = {
  //Do real stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

在您的控制器类中:

package controllers

import services._

class Users(service: MyService) extends Controller {
  def show(id: String) = Action {
    val user = service.getUser(id)
    Ok(views.html.user(user))
  }
}

object Users extends controllers.Users(new ConcreteService()) {}
Run Code Online (Sandbox Code Playgroud)

现在你可以运行一些单元测试..

package test

import controllers.Users
import play.api.test._
import play.api.test.Helpers._

import org.specs2.mock.Mockito
import org.specs2.mutable.Specification

class UsersSpec extends Specification with Mockito {
  val service = mock[MyService]

  "Users controller" should {
    "list users" in {
      //Insert mocking stuff here

      val users = new Users(service)
      val result = users.show("somerandomid")(FakeRequest())
      status(result) must equalTo(OK)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我有同样的问题,并尝试了一些选择:

  • 蛋糕模式
  • 通过隐式注入
  • 弹簧

你可以在这里看到github上的代码.