在ScalaTest中组合测试夹具的更好方法

时间:2015-03-04 03:04:44

标签: scala composition scalatest

我们使用loan pattern测试灯具。利用这种模式来创建种子数据"测试运行所需。当测试依赖于数据时以下

"save definition" should {
"create a new record" in withSubject { implicit subject =>
  withDataSource { implicit datasource =>
    withFormType { implicit formtype =>

        val definitn = DefinitionModel(-1, datasource.id, formtype.id, subject.role.id, Some(properties))
    }
  }
}

其中withSubjectwithDataSourcewithFormType是分别从数据库返回subjectdataSourceformType数据的测试装置。 withDataSource fixture需要隐式subject。构建DefinitionModel需要datasource.idformtype.id。所以根据测试的数据要求调用这样的数据构建器夹具会产生很多嵌套夹具的情况。是否有更好的方式来构建" /结构这样的装置?

2 个答案:

答案 0 :(得分:4)

@Nader Hadji Ghanbari给出的答案仍然有效。我想补充一点,因为版本3.x.x的scalatest特征改变了名称。从迁移指南中复制:

  

覆盖withFixture的混合特性

     

4)在3.0.0中,withFixture方法已从Suite移动到新的   特质,TestSuite。这样做是为了为withFixture方法腾出空间   在AsyncTestSuite中使用不同的签名。如果你考虑了一个   withFixture方法成为一个单独的“套件mixin”特性,你需要   将“Suite”更改为“TestSuite”,将“SuiteMixin”更改为“TestSuiteMixin”。   例如,鉴于2.2.6的这个特性:

trait YourMixinTrait extends SuiteMixin { this: Suite =>
 abstract override def withFixture(test: NoArgTest): Outcome = {
   // ...
 }
}
     

您需要添加“Test”前缀,如下所示:

trait YourMixinTrait extends TestSuiteMixin { this: TestSuite =>
 abstract override def withFixture(test: NoArgTest): Outcome = {
   // ...
 }
}

答案 1 :(得分:3)

性状

trait是你的朋友。组合是trait非常好的要求之一。

组成特征

来自Scala Test Docs

  

通过堆叠特征来构建装置

     

在较大的项目中,团队通常最终会使用几种不同的装置   测试类需要不同的组合,并且可能   以不同的顺序初始化(和清理)。一个好方法   在ScalaTest中实现这一点就是将各个灯具分解为   可以使用可堆叠特征模式组成的特征。这个   例如,可以通过将ofFixture方法放在几个中来完成   特征,每个特征都称为super.withFixture。

例如,您可以定义以下trait s

trait Subject extends SuiteMixin { this: Suite =>

  val subject = "Some Subject"

  abstract override def withFixture(test: NoArgTest) = {
    try super.withFixture(test) // To be stackable, must call super.withFixture
    // finally clear the context if necessary, clear buffers, close resources, etc.
  }
}

trait FormData extends SuiteMixin { this: Suite =>

  val formData = ...

  abstract override def withFixture(test: NoArgTest) = {
    try super.withFixture(test) // To be stackable, must call super.withFixture
    // finally clear the context if necessary, clear buffers, close resources, etc.
  }
}

然后,您只需将这些trait混合到您的测试环境中即可:

class ExampleSpec extends FlatSpec with FormData with Subject {

    "save definition" should {
        "create a new record" in {

            // use subject and formData here in the test logic            

        }
    }

}

Stackable Traits

有关Stackable Traits Pattern的详情,请参阅this article