Perhaps I’ve written it somewhere else, but IMO scope injection would make tests much better.
Consider this code:
package scope
import java.io.Closeable
import java.nio.file.{Files, Path}
import org.scalatest.{FlatSpec, MustMatchers}
class FixturesDemoSpec extends FlatSpec with MustMatchers {
behavior of "something"
it must "do thing 1" in test(1, "a") { fixture =>
import fixture._
// test body
}
it must "do thing 2" in test(2, "b") { fixture =>
import fixture._
// test body
}
it must "do thing 3" in test(3, "c") { fixture =>
import fixture._
// test body
}
class Fixture(val resource: Any, val service: Any, val tempDir: Any)
def test(arg1: Int, arg2: String)(body: Fixture => Unit): Unit = {
val resource: Closeable = ???
val service: Closeable = ???
val tempDir: Path = ???
try {
body(new Fixture(resource, service, tempDir))
} finally {
resource.close()
service.close()
Files.delete(tempDir)
}
}
}
Assuming average test body is just a few lines then additional import fixture._
makes code a bit clumsy.
Replacing this:
it must "do thing 1" in test(1, "a") { fixture =>
import fixture._
// test body
}
with:
it must "do thing 1" in test(1, "a") { this =>
// test body
}
would make tests much more elegant (no repetition) and somewhat more readable.
I don’t see how implicit functions, implicit conversions, etc would replace scope injection without adding a lot of bloat (effectively making that pointless).