模拟对象在游戏中[2.0]

时间:2012-04-07 09:47:38

标签: scala testing dependency-injection playframework playframework-2.0

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

  1. 在测试期间提供备用路径文件
  2. 使用依赖注入,并在运行时检查全局值
  3. 我不确定哪个更可行,或者如何去做。任何见解将不胜感激。

4 个答案:

答案 0 :(得分:13)

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

你的特质+实施:

package services

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

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

在您的控制器类中:

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()) {}

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

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)
    }
  }
}

答案 1 :(得分:6)

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

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

您可以在github here上看到代码。

答案 2 :(得分:3)

我的解决方案类似于Blake的,除了我没有控制器作为类。您可以查看source here

答案 3 :(得分:2)

作为参考,我添加了一个使用Play的插件框架在测试期间注入模拟对象的示例。

  1. http://www.underflow.ca/blog/935/mock-dependency-injection-in-play-2-0
  2. 使用此方法可以在测试时提供模拟插件:

    class Test extends Specification {
        "application" should {
            "load mock dependency" in {
                running(TestServer(9000, FakeApplication(
    
                // The plugin at this class replaces the default
                additionalPlugins = Seq("test.MockInjector")
    
                )), HTMLUNIT) { browser =>
                    browser.goTo("http://localhost:9000")
    
                    // Test mock controller
    
                }
            }
        }
    }
    

    MockInjector可用于提供控制器对象或任何其他可注射组件。

    注意:我写了博客文章,任何人都可以自由地将博客中的所有内容迁移到此处。