This is an excerpt from the 1st Edition of the Scala Cookbook. This is Recipe 12.7, “How to use a String like it's a file in Scala.”
Problem
Typically for the purposes of testing, you want to pretend that a String
is a file in your Scala code.
Solution
Because Scala.fromFile
and Scala.fromString
both extend scala.io.Source, they are easily interchangeable. As long as your method takes a Source
reference, you can pass it the BufferedSource
you get from calling Source.fromFile
, or the Source
you get from calling Source.fromString
.
For example, the following method takes a Source
object and prints the lines it contains:
import io.Source def printLines(source: Source) { for (line <- source.getLines) { println(line) } }
It can be called when the source is constructed from a String
:
val s = Source.fromString("foo\nbar\n") printLines(s)
It can also be called when the source is a file:
val f = Source.fromFile("/Users/Al/.bash_profile") printLines(f)
Discussion
When writing unit tests, you might have a method like this that you’d like to test:
package foo object FileUtils { def getLinesUppercased(source: io.Source): List[String] = { (for (line <- source.getLines) yield line.toUpperCase).toList } }
As shown in the following ScalaTest tests, you can test the getLinesUppercased
method by passing it either a Source
from a file or a String
:
package foo import org.scalatest.{FunSuite, BeforeAndAfter} import scala.io.Source class FileUtilTests extends FunSuite with BeforeAndAfter { var source: Source = _ after { source.close } // assumes the file has the string "foo" as its first line test("1 - foo file") { source = Source.fromFile("/Users/Al/tmp/foo") val lines = FileUtils.getLinesUppercased(source) assert(lines(0) == "FOO") } test("2 - foo string") { source = Source.fromString("foo\n") val lines = FileUtils.getLinesUppercased(source) assert(lines(0) == "FOO") } }
In summary, if you’re interested in making your method easily testable with a String
instead of a file, define your method to take a Source
instance.
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |