加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 测试Play Slick app

发布时间:2020-12-16 18:55:29 所属栏目:安全 来源:网络整理
导读:我有一个简单的CRUD应用程序,使用 Scala Play 2.4.3和Play-slick 1.1.0(光滑的3.1.0)构建,它使用 MySQL数据库进行持久存储. 我试图为我的应用程序创建测试,我看到了两个主要选项: 模拟数据库访问,据我所见,需要进行一些代码更改 make tests使用替代数据库(
我有一个简单的CRUD应用程序,使用 Scala Play 2.4.3和Play-slick 1.1.0(光滑的3.1.0)构建,它使用 MySQL数据库进行持久存储.

我试图为我的应用程序创建测试,我看到了两个主要选项:

>模拟数据库访问,据我所见,需要进行一些代码更改
> make tests使用替代数据库(可能在内存H2中).

什么是最好的方法(优势和消极)?

我更喜欢第二种方法,但我在设置测试时遇到了一些困难.

我需要做什么?首先,我认为我需要用FakeApplication进行测试,对吧?我是否需要任何sbt依赖才能做到这一点?

之后,如何指定使用H2数据库?

解决方法

我有同样的斗争,我想出了这样的解决方案(使用第二种方法):

为DAO创建一个上下文来使用:

trait BaseContext{

  def dbName: String

  val dbConfig = DatabaseConfigProvider.get[JdbcProfile](dbName)
  val db = dbConfig.db
  val profile = dbConfig.driver
  val tables = new Tables {  // this is generated by Schema Code Generator
    override val profile: JdbcProfile = dbConfig.driver
  }
}

@Singleton
class AppContext extends BaseContext{
  def dbName = "mysql"  // name in your conf right after "slick.dbs"
}

@Singleton
class TestingContext extends BaseContext{
  def dbName = "h2"
}

然后创建一个模块来绑定注入,并且不要忘记使用play.modules.enabled =“your.Module”在conf中启用它:

class ContextModule(environment: Environment,configuration: Configuration) extends AbstractModule {

  override def configure(): Unit = {
    if (configuration.getString("app.mode").contains("test")) {
      bind(classOf[BaseContext])
          .to(classOf[TestingContext])
    } else {
      bind(classOf[BaseContext])
          .to(classOf[AppContext])
    }
  }
}

并将它注入您创建的每个DAO:

class SomeDAO @Inject()(context: BaseContext){

  val dbConfig = context.dbConfig
  val db = context.db
  val tables = context.tables
  import tables.profile.api._

  def otherStuff....
  // you can call db.run(...),tables.WhateverYourTableIs,tables.TableRowCaseClass,...
}

最后一步,你的配置文件.在我的例子中,我使用app.mode来标记环境,并且我为不同的环境使用单独的.conf.原因是,在这些配置中,您必须具有正确的数据库配置.这是样本:

app.mode = "test"

# Database configuration
slick.dbs = {
  # for unit test
  h2 {
    driver = "slick.driver.H2Driver$"
    db = {
      url = "jdbc:h2:mem:test;MODE=MYSQL"
      driver = "org.h2.Driver"
      keepAliveConnection = true
    }
  }
}

我很确定我的解决方案不是一个优雅的解决方案,但它可以提供货物.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读