это лучший и быстрый в использовании
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;
}
Если реализации 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
утверждает, что если один тест не пройден, все свойство не будет выполнено.