Scala-тестирование черт, применяемых для реализации подклассов

это лучший и быстрый в использовании

function get_string_between ($str,$from,$to) {

    $string = substr($str, strpos($str, $from) + strlen($from));

    if (strstr ($string,$to,TRUE) != FALSE) {

        $string = strstr ($string,$to,TRUE);

    }

    return $string;

}
1
задан Ramon J Romero y Vigil 1 March 2019 в 15:11
поделиться

1 ответ

Если реализации Bar.doesStuff и Baz.doesStuff ведут себя по-разному, подходящим решением является наличие двух отдельных тестов.

import org.scalatest.FlatSpec

class FooSpec1 extends FlatSpec {

  "a Bar" should "do a bar thing" in {
    Bar().doesStuff() == 42
  }

  "a Baz" should "do a baz thing" in {
    Baz().doesStuff() % 2 == 0
  }

}

Однако, если они имеют одинаковое поведение, вы можете изменить рефакторинг тестов с помощью функции, чтобы избежать дублирования кода. Я не верю, что scalatest может достичь этого шаблона повторного использования на уровне спецификации, как вы и просили.

import org.scalatest.FlatSpec

class FooSpec2 extends FlatSpec {

  def checkDoesStuff(foo: Foo): Boolean =
    foo.doesStuff() == 42

  "a Bar" should "do a bar thing" in {
    checkDoesStuff(Bar())
  }

  "a Baz" should "do a baz thing" in {
    checkDoesStuff(Baz())
  }

}

Тем не менее, тестирование на основе свойств может сделать именно то, что вы ищете. Вот пример использования scalacheck:

import org.scalacheck.{Gen, Properties}
import org.scalacheck.Prop.forAll

object FooProperties extends Properties("Foo"){

  val fooGen: Gen[Foo] = Gen.pick(1, List(Bar(), Baz())).map(_.head)

  property("a Foo always does stuff") = forAll(fooGen){
    (foo: Foo) => foo.doesStuff() == 42
  }

}

В отличие от спецификаций ScalaTest, свойства всегда являются функциями. Функция forAll берет генератор, выбирает значения генератора и запускает тест на всех выборках. Наш генератор всегда будет возвращать экземпляр Bar или Baz, что означает, что свойство будет охватывать все случаи, которые вы хотите проверить. forAll утверждает, что если один тест не пройден, все свойство не будет выполнено.

0
ответ дан codenoodle 1 March 2019 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: