这并不是一个fp问题,因为我看不出您的代码在fp方面有任何问题,但是在我看来,您应该做的是使用依赖注入,这样,对于测试,您可以用一个测试类替换
IO
肯定会有反应的。像这样的:
abstract class IO {
def getHtmlFromWebsiteViaHttp(link: String, apiKey: String = ""): String
}
class IOImpl extends IO {
def getHtmlFromWebsiteViaHttp(link: String, apiKey: String = ""): String = {
Http(link)
.param("access_token", apiKey)
.asString
.body
}
}
class IOTestImpl extends IO {
def getHtmlFromWebsiteViaHttp(link: String, apiKey: String = ""): String = ??? //some test HTML
}
然后在你的服务中:
class SongService(io: IO) {
private def retrieveSongId(songName: String): Option[JsValue] = {
val formattedSongName = songName.replace(" ", "%20")
val searchLink = "https://api.genius.com/search?q=" + formattedSongName
val geniusStringResponse = io.getHtmlFromWebsiteViaHttp(searchLink, apiKey)
//Extra processing on geniusStringResponse
}
}
然后当你实例化
SongService
,通过它
IOTestImpl
在测试和
IOImpl
否则。你可能会发现一些相关的信息
dependency injection
和
database access objects
是的。