3

我有 FlatSpec 测试类,需要对一些夹具数据使用 REST 服务。当一次运行所有测试时,我真的只想实例化一次 REST 客户端,因为它可能非常昂贵。当我在我的 IDE 中运行时,我该如何解决这个问题,并且我还能让它运行一个测试类吗?

4

2 回答 2

1

1.使用模拟:

我建议您在尝试测试 REST 服务时使用某种模拟。您可以尝试例如 scala-mock。创建模拟服务不消耗时间/CPU,因此您可以在所有测试中创建模拟并且不需要共享它们。看:

trait MyRestService {
  def get(): String
}

class MyOtherService(val myRestService: MyRestService) {
  def addParentheses = s"""(${myRestService.getClass()})"""
}

import org.scalamock.scalatest.MockFactory

class MySpec extends FreeSpec with MockFactory {

  "test1 " in {
    // create mock rest service and define it's behaviour
    val myRestService = mock[MyRestService]
    val myOtherService = new MyOtherService(myRestService)
    inAnyOrder {
      (myRestService.get _).expects().returning("ABC")
    }

    //now it's ready, you can use it
    assert(myOtherService.addParentheses === "(ABC)")
  }
}

2.或者使用共享灯具:

如果您仍想使用 REST 服务的实际实现并仅创建一个实例,然后使用以下方法与一些测试条件共享它:

  • get-fixture 方法 => 当您在多个测试中需要相同的可变夹具对象时使用它,并且不需要在之后清理。

  • withFixture(OneArgTest) => 当所有或大多数测试需要相同的固定装置时使用,这些固定装置必须在之后清理。

有关更多详细信息和代码示例,请参阅http://www.scalatest.org/user_guide/sharing_fixtures#loanFixtureMethods

如果您想针对多个套件共享相同的夹具,请使用org.scalatest.Suites@DoNotDiscover注释(这些至少需要 scalatest-2.0.RC1)

于 2013-10-08T17:35:15.643 回答
0

Pawel 的最后评论很合适。通过使用 BeforaAndAfterAll 而不是 Suites 从 Suite 继承会更容易。

import com.typesafe.config.ConfigFactory
import com.google.inject.Guice
import org.scalatest.{BeforeAndAfterAll, Suite}
import net.codingwell.scalaguice.InjectorExtensions.ScalaInjector

class EndToEndSuite extends Suite with BeforeAndAfterAll {

    private val injector = {
        val config = ConfigFactory.load
        val module = new AppModule(config) // your module here
        new ScalaInjector(Guice.createInjector(module))
    }

    override def afterAll {
        // your shutdown if needed
    }

    override val nestedSuites = collection.immutable.IndexedSeq(
        injector.instance[YourTest1],
        injector.instance[YourTest2] //...
    )
}
于 2015-06-25T09:12:33.377 回答