我有一组测试,所有这些测试在每次测试之前都需要相同的代码,为此我很乐意使用BeforeAndAfterEach。我需要使用不同的灯具设置执行几次测试。为了多次执行测试,我使用FlatSpecLike中的“应该表现得像”的测试共享。但是,我没有看到一种优雅的方式将“应该表现得像”与BeforeAndAfterEach结合起来。
目前我使用下面介绍的基于标签的方法。相当难看。
问题:是否有更优雅的方式在集合中的每个测试之前使用的不同设置下执行一组测试。
class TestSpec() extends FlatSpecLike with Matchers with BeforeAndAfterEachTestData {
// have to invent a tag with a name for each object of Settings
val TagNamePrefix = "MySettingsTag"
case object NormalTag extends Tag(TagNamePrefix+"Normal")
case object SpecialTag extends Tag(TagNamePrefix+"Special")
// and put them into a map by name
var settingsMap: String => Settings = Map (
NormalTag.name -> Settings(0, 0, someGlobalNormalObject),
SpecialTag.name -> Settings(10, 10, someGlobalSpecialObject)
)
override def beforeEach(testData: TestData) {
val s: Settings = retrieveSettings(testData)
// some code here depending on the settings
super.beforeEach(testData)
}
/** the ugly way to retrieve settings in beforeEach */
private def retrieveSettings(testData: TestData): Settings = {
val tags = testData.tags.filter(_.startsWith(TagNamePrefix))
assert(tags.size == 1)
settingsMap(tags.last)
}
"A thing" should behave like testSet(NormalTag)
"A thing with special settings" should behave like testSet(SpecialTag)
def testSet(t: Tag) {
it should "test something" taggedAs t in {
// ...
}
it should "test something else" taggedAs t in {
// ...
}
}
}