Search code examples
scalaunit-testingimplicitscala-catstagless-final

Could not find implicit in Scala Tagless Final, Implicit, unit test


Getting:

Error:(20, 5) could not find implicit value for parameter console: example.Console[F]
    new NameThing().program
Error:(20, 5) not enough arguments for constructor NameThing: (implicit evidence$1: cats.Monad[cats.package.Id], implicit console: example.Console[cats.package.Id])example.NameThing[cats.package.Id].
Unspecified value parameter console.
    new NameThing().program

Not sure why.

I'm trying to understand unit testing with Tagless Final

So i have:

case class FullName(first:String, last:String)

trait Console[F[_]] {
  def prompt:F[Unit]
  def read:F[String]
  def display(fullName: FullName):F[Unit]
}

class NameThing[F[_]: Monad](implicit console: Console[F]) {

  def program: F[Unit] = for {
    _ <- console.prompt
    rawName <- console.read
    fullName = parse(rawName)
    _ <- console.display(fullName)
  } yield ()

  def parse(rawName:String):FullName = {
    val parts = rawName.split(" ")
    FullName(parts(0), parts(1))
  }
}

And in my unit test I have:

   case class TestEnv()
   type Test[A] = Reader[TestEnv, A]

   implicit object TestConsole extends Console[Test] {
      override def prompt: Test[Unit] = Reader(_ => Unit)
      override def read: Test[String] =  Reader(_ => "Joe Bloggs")
      override def display(fullName: FullName): Test[Unit] = Reader(_ => Unit)
    }

    new NameThing().program

Full Code: https://bitbucket.org/jameskingconsulting/scala-effects/src/master/


Solution

  • Try

    new NameThing[Test]().program
    

    Type parameter seems to be inferred as cats.Id instead of Test.