LINUX.ORG.RU

Тестирование скала-приложений

 


0

1

Начал учить скалу по книге «functional programming in scala». Имею следующее:

package chapter01

object MyModule {
  def abs(n: Int): Int =
    if (n < 0) -n
    else n

  private def formatAbs(x: Int): String = {
    val msg = "The absolute value of %d is %d"
    msg.format(x, abs(x))
  }

  def main(args: Array[String]): Unit =
    println(formatAbs(-42))
}

Теперь хочу написать кое-какие тесты. И, если для функций abs и formatAbs я смог кое-что написать:

import org.scalatest._
import org.scalatest.PrivateMethodTester._

import chapter01.MyModule

class chapter01Spec extends FlatSpec with Matchers {
  "Absolute value of neg integers" should "return correct values" in {
    MyModule.abs(-42) should be(42)
    MyModule.abs(-1234567890) should be(1234567890)
    MyModule.abs(42) should be(42)
  }

  "formatAbs" should "return correct string" in {
    val formatAbs = PrivateMethod[String]('formatAbs)
    MyModule invokePrivate formatAbs(-42) should be("The absolute value of -42 is 42")
  }
....

то для функции main ничего не могу придумать. Точнее родил тест на проверку типа возвращаемого значения:

....
  "main" should "return Unit type" in {
    val formatAbs = PrivateMethod[String]('formatAbs)
    val a = MyModule.main(new Array[String](0))
    val b = MyModule invokePrivate formatAbs(-42)
    a should be (println(b))}}

Почитал про scalamock, но не понял, как мокать синглтон.

Словом, нужна помощь.

для функции main ничего не могу придумать.

Для неё и не надо, она с сайд эффектом.

Debasher ★★★★★
()

З.Ы. В упор не вижу элементов фп в примере.

Для тестирования сайд-эффектов можно завернуть «нечистые функции» в отдельные методы и мокать для получения результата, а не сайд-эффекта. В твоем случае это будет не вывод на экран «42\n», а результат замоканного метода в виде строки «42\n». Это уже тестируемо.

Если сайд эффект используется далее в логики (например, запись в БД), то мок метода может записывать результат в какой-нибудь промежуточный объект (например, мапу), эмулирующий в тесте эту БД, и тогда остальные методы тестируемой логики также ложны быть замоканы на предмет работы с этим промежуточным объектом.

Ritmik
()

Я то думал, что у тех кто пишут на богоподобной Scala нет нужды тестировать приложения, ибо они пишут без ошибок, а еще там все типизировано в щи.

umren ★★★★★
()
Ответ на: комментарий от umren

Нет, мы просто не тестируем, что будет, если в метод для извлечения корня числа передать строку.

anonymous
()

не надо main тестировать просто.

dizza ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.