Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala以函数样式创建用于测试的随机对象_Scala - Fatal编程技术网

Scala以函数样式创建用于测试的随机对象

Scala以函数样式创建用于测试的随机对象,scala,Scala,我正试图找出在这种情况下哪种风格最实用 我有一个图像模型 case class Image( id: Int, name: String, title: String, permalink: String, url: String ) 我有一个TestHelper对象,它可以帮助我编写测试,因为它允许我创建随机图像对象 package utils import models.Pet import scala.util.Random object TestHelper

我正试图找出在这种情况下哪种风格最实用

我有一个图像模型

case class Image(
  id: Int,
  name: String,
  title: String,
  permalink: String,
  url: String 
)
我有一个TestHelper对象,它可以帮助我编写测试,因为它允许我创建随机图像对象

package utils

import models.Pet
import scala.util.Random

object TestHelper {

  val random = new Random()

  def randomId = random.nextInt(Integer.MAX_VALUE)

  val nameList: List[String] = List("Joycelyn", "Shaunte", "Aurelio", "Jeane", "Carline", "Major", "Shawanna", "Hayden", "Benjamin", "Roxy", "Ardelia", "Yanira", "Tilda", "Claude", "Jonah", "Ilse", "Kieth", "Elmira", "Reid", "Bethann", "Catherine", "Yasuko", "Kia", "Merri", "Ethelyn", "Mallory", "Eustolia", "Matt", "Lynelle", "Christi", "Alane", "Miles", "Ressie", "Darryl", "Kathy", "Hiedi", "Kacy", "Cecila", "Tamar", "Dwayne", "Charlette", "Wanetta", "Sonja", "Celine", "Vina", "Teresa", "Dagny", "Debera", "Doreatha", "Wilda")

  def randomImage: Image = {
    var id = randomId
    var name = nameList(random.nextInt(nameList.length))
    var title = name
    var permalink = name.toLowerCase
    var logoUrl = s"https://www.images.com/${permalink}"
    Image(id, name, title, permalink, logoUrl)
  }

}

但我知道,如果我想用函数式风格编写,我应该避免使用
var
。如果我不多次使用字段
name
,那么用
def
s替换所有
var
s就足够了,但是由于我需要重复该值,我不确定如何以函数样式编写它,您可以使用它。ScalaCheck是函数式语言Haskell的库QuickCheck的一个端口,它允许您以函数式风格编写随机测试示例生成器。

您可以使用它。ScalaCheck是函数式语言Haskell的库QuickCheck的一个端口,它允许您以函数式风格编写随机测试示例生成器。

看看我们的一个LIB(无耻免责声明)

util采样器

它使用宏来导航案例类的结构并生成适当的示例。这不是一个灵丹妙药,但它将在大多数时间处理大多数事情,并且它还将尽可能生成有意义的数据

例如,如果该字段名为name,则将得到“Peter Smith”样式的结果。它还与Scalacheck完全兼容,但总体上相当基本,有一个非常简单的宏。它的简单性是由我写的

val imageGenerator = Sample.generator[Image]
implicit val imageArb = Sample.arbitrary[Image]
你可以直接把它插入到你的功能检查程序中

forAll { img: Image => ....
}
如果您根本不想使用scalacheck,只需使用基本功能:

import com.outworkers.util.samplers._

class MyTest extends FlatSpec {
  it should "upload an image to S3" in {
    val image = gen[Image]
    val images = genList[Image](25)

  }
}
如果无法生成类型或宏出现问题,只需自己编写一个采样器即可。在大多数情况下,你会有一个特征或对象来容纳所有这些特征或对象

object ExtraSamples {
  implicit val cantAutomateThis: Sample[java.net.Bla] = new Sample[java.net.Bla] {
    override def sample: java.net.Bla = // in here you fill it in manuall....
  }
}
然后,如果您有一个带有
java.net.Bla
字段的
case类
,您只需
导入额外示例即可。在您执行
gen
的地方,您的手动实现将用于构建更复杂的示例。这就是如何支持任何不支持的开箱即用

scalacheck不成形

这是对同一问题的不同理解,但它不是使用宏,而是使用来自shapeless的自动typeclass实例派生功能。它的方法与
util samplers
没有太大区别,但是代码可能稍微复杂一些,但级别更高


我从来没有做过边对边的比较,他们也不打算互相竞争。第一个宏速度极快,重量极轻,开销最小,因为它只是一个宏,而不成形的宏更复杂,编译时间更高,但它可能在自动生成类型方面更高级。

看看我们的一个libs(无耻免责声明)

util采样器

它使用宏来导航案例类的结构并生成适当的示例。这不是一个灵丹妙药,但它将在大多数时间处理大多数事情,并且它还将尽可能生成有意义的数据

例如,如果该字段名为name,则将得到“Peter Smith”样式的结果。它还与Scalacheck完全兼容,但总体上相当基本,有一个非常简单的宏。它的简单性是由我写的

val imageGenerator = Sample.generator[Image]
implicit val imageArb = Sample.arbitrary[Image]
你可以直接把它插入到你的功能检查程序中

forAll { img: Image => ....
}
如果您根本不想使用scalacheck,只需使用基本功能:

import com.outworkers.util.samplers._

class MyTest extends FlatSpec {
  it should "upload an image to S3" in {
    val image = gen[Image]
    val images = genList[Image](25)

  }
}
如果无法生成类型或宏出现问题,只需自己编写一个采样器即可。在大多数情况下,你会有一个特征或对象来容纳所有这些特征或对象

object ExtraSamples {
  implicit val cantAutomateThis: Sample[java.net.Bla] = new Sample[java.net.Bla] {
    override def sample: java.net.Bla = // in here you fill it in manuall....
  }
}
然后,如果您有一个带有
java.net.Bla
字段的
case类
,您只需
导入额外示例即可。在您执行
gen
的地方,您的手动实现将用于构建更复杂的示例。这就是如何支持任何不支持的开箱即用

scalacheck不成形

这是对同一问题的不同理解,但它不是使用宏,而是使用来自shapeless的自动typeclass实例派生功能。它的方法与
util samplers
没有太大区别,但是代码可能稍微复杂一些,但级别更高


我从来没有做过边对边的比较,他们也不打算互相竞争。第一个宏速度极快,重量极轻,开销最小,因为它只是一个宏,而不成形的宏更复杂,编译时间也更高,但在自动生成类型方面可能更高级。

在这种情况下,你可以简单地用
val
s替换所有本地
var
s,因为你没有变异
var
s。

在这种特殊情况下,你可以简单地用
val
s替换所有本地
var
s,因为你没有变异
var
s。

?如果您不需要任何
var
s,那么用
val
替换
var
?有什么问题吗?@Andreytukin谢谢你的评论,我意识到我没有把我的观点说清楚。问题是,如果我用
val
s替换
var
s,我总是得到相同的对象。什么?。。。这听起来很荒谬。如果将
var
s替换为
val
s,则不会改变代码的行为,因为您永远不会对这些变量进行变异。@Andreytukin您是对的!谢谢你的评论,他们帮助我认识到我的一些误解。嗯?如果您不需要任何
var
s,那么用
val
替换
var
?有什么问题吗?@Andreytukin谢谢你的评论,我意识到我没有把我的观点说清楚。问题