2016-04-21 11 views
4

Zuerst sah ich es und this other post klingt genau wie, was ich brauche, außer für eine Sache, kann ich nicht fixture.TestDataFixture verwenden, weil ich Fixture.FreeSpecLike nicht verlängern kann, und ich bin sicher, dass es einige sein muss Art und Weise der Testnamen in einer Art und Weise zu erhalten, die ähnliche Produkte (gedachten Code, der nicht kompilieren) siehtScalaTest Testname ohne Halterung?

class MySpec extends FlatSpecLike with fixture.TestDataFixture { 
    "this technique" - { 
    "should work" in { 
     assert(testData.name == "this technique should work") 
    } 
    "should be easy" in { td => 
     assert(testData.name == "this technique should be easy") 
    } 
    } 
} 

Irgendwelche Ideen? Ich kann einfach nicht glauben, dass so etwas wie dies nicht möglich ist: D

Antwort

0

Und fand eine Antwort (auch ein Kollege tat), nicht sicher, ob ich es mag, aber funktioniert:

auf das Merkmal, dass andere Tests hängen von

class MySpec extends FlatSpecLike { 
//... other stuff 
    var testName = "UndefinedTestName" 
    override def withFixture (test: NoArgTest) :Outcome= { 
     testName = test.name 
     super.withFixture(test) 
    } 
} 

einfache Lösung, aber ziemlich dunkel, frage ich mich auch, wenn jemand damit Probleme sieht

1

Während Sie bereits diese Lösung grundsätzlich kam, hier ist eine sicherere Variante:

private val _currentTestName = new ThreadLocal[String] 

override def withFixture(test: NoArgTest) = { 
    _currentTestName.set(test.name) 
    val outcome = super.withFixture(test) 
    _currentTestName.set(null) 
    outcome 
} 

protected def currentTestName: String = { 
    val testName = _currentTestName.get() 
    assert(testName != null, "currentTestName should only be called in a test") 
    testName 
} 

Alternativ

protected def currentTestName = Option(_currentTestName.get())