有没有办法测试嵌套函数(理想情况下使用ScalaTest)?
例如,有没有办法g()在下面的代码中测试:
def f() = {
def g() = "a string!"
g() + "– says g"
}
Run Code Online (Sandbox Code Playgroud) 在TestNg和Java中,我们可以使用DataProvider运行多个测试用例,这可以作为单独的测试运行,这意味着测试的执行不会在失败时停止.是否有ScalaTest或Specs/Specs2的模拟?
我正在尝试用期货编写一个规范,我不确定我应该如何使用这个Futures特性.我必须传递whenReady一个FutureConcept,但我找不到我应该如何构建一个Future.文件内容如下:
为了使whenReady更广泛适用,它接受的未来类型是FutureConcept [T],其中T是未来承诺的价值类型.将future传递给whenReady需要从您希望传递的未来类型(建模类型)到FutureConcept [T]的隐式转换.
据我所知,我必须在a Future和a 之间写一个隐式转换FutureConcept(这对我来说似乎不对,因为它似乎应该是样板文件,但它是我唯一可以做到的).我无法弄清楚如何做到这一点,FutureConcept的文档很方便地告诉我
有关此特征为期货测试提供的语法的详细信息,请参阅特征期货的文档.
让我走完整圈.我做的最简单的例子是
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import org.scalatest.WordSpecLike
import org.scalatest.concurrent._
class FutureSpec extends WordSpecLike with Futures {
"A future" must {
"be a valid argument for whenReady" in {
val fut = future { 42 }
whenReady(fut) { res => s should be 42 }
}
}
}
Run Code Online (Sandbox Code Playgroud)
那不编译
- 类型不匹配; 发现:scala.concurrent.Future [Int] required:FutureSpec.this.FutureConcept [?]
- ';' 预期,但发现整数字面量.
我应该做些什么呢?
我正在尝试编写一个测试,以验证我的演员下面是创建heartBeatExpireWorker和heartBeatAccepter,但我不知道该怎么做.
首先,我想我可以使用Mockhito模拟或间谍代替上下文然后验证我调用了actorOf,但我无法找到一种方法来注入上下文而不破坏Akka测试框架.
然后,我想我可以向工人发送识别信息以验证它们是否存在.但是我发现这不起作用,因为Akka TestKit似乎没有创建被测试演员的儿童演员.它只能接受可以代表相邻参与者的Testprobes.
class HeartBeatPumpWorker(chatService: ChatService, target: HeartBeatMessageCmd) extends Actor with ActorLogging with
WorkersReference {
val heartBeatInterval = chatService.getHeartBeatInterval
val tick = context.system.scheduler.schedule(0 millis, heartBeatInterval millis, self, SendHeartBeat(target))
override def postStop() = tick.cancel()
def receive = {
case SendHeartBeat(command: HeartBeatMessageCmd) =>
log.debug("Sending heartbeat")
//Send heartbeat to GWT
val userTarget = NetworkWorker.buildEventUserTarget(command.getEventCode, command.getUser)
val uuid: String = UUID.randomUUID().toString
val freshCommand = new HeartBeatMessageCmd(command.getUser, command.getEventCode, uuid, command.getUserSession)
networkWorker ! NetworkBroadcast(userTarget, freshCommand)
val heartBeatId: String = freshCommand.getUuid
//create expirer
val heartBeatExpireWorkerRef = …Run Code Online (Sandbox Code Playgroud) 我遇到了一个我无法解释的问题......在https://github.com/betehess/play-scalatest的项目中它是孤立的.
当我运行时test,sbt卡住一段时间然后抛出此异常:
> test
[error] Uncaught exception when running tests: java.net.ConnectException: Connection timed out
Exception in thread "Thread-1" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2293)
at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2473)
at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2543)
at java.io.ObjectInputStream$BlockDataInputStream.skipBlockData(ObjectInputStream.java:2445)
at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1941)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:500)
at java.lang.Throwable.readObject(Throwable.java:914)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个ScalaTest匹配器来检查列表是否包含所有需要的元素(在另一个列表中给出),但也可能是其他元素.
contain allOf 要求获得两个固定元素,由于某种原因,其余的作为varargs.
我可以做这样的解决方法,但它非常难看:
val list = List(1,2,3,4)
val wanted = List(1,2,3)
list should contain allOf ( wanted.head, wanted.tail.head, wanted.tail.tail :_* ) // ugly workaround
Run Code Online (Sandbox Code Playgroud)
为了给列表作为匹配,有contain theSameElementsAs.但是,它不允许无关元素出现在探测值中(我认为).
所以:
allOf声明必须在前面给出两个固定元素(即为什么不通过varargs?)theSameElementsAndMaybeMoreThan方法(可能有更好的名字)?我试过的一些代码:
val list = List.empty[String]
//list should contain allOf("a") // does not compile
list should contain allOf("a","b")
list should contain allOf("a","b","c")
val wanted = List("a","b","c")
//list should contain allOf( wanted ) // does not compile
list should contain allOf( wanted.head, wanted.tail ) …Run Code Online (Sandbox Code Playgroud) 我有一个我已经工作多年的Maven/Java项目,我想接受JavaPosse的建议并开始在Scala中编写我的测试.我在ScalaTest的JUnit4快速启动后编写了一些测试,现在我希望在运行"mvn test"时执行这些测试.我该怎么做?我应该在pom.xml中添加什么来允许src/test/scala中的测试并行运行我的旧JUnit4测试?
干杯
聂
PS,是的,我一直在谷歌搜索,但我能找到的关于这个主题的一些前v1.0建议,我没有得到工作
PPS,红利问题:我如何通过在Eclipse/STS中右键单击它们,然后说"Debug As ... ScalaTest"或类似的东西,我到目前为止所说的"调试为..."一次一个地运行这些测试. .JUnit测试"?
PPPS,我预计自2009年7月以来答案已经改变了?
如果您匹配列表或地图或任何其他复杂结构,那么查看给定内容与预期内容之间的差异非常有用.例如:
Map("a" -> 1, "b" -> 2, "c" -> 3) should equal Map("a" -> 1, "b" -> 5, "c" -> 3)
// ScalaTest output:
[info] Map("a" -> 1, "b" -> 2, "c" -> 3) did not equal Map("a" -> 1, "b" -> 5, "c" -> 3) (Test.scala)
[info] org.scalatest.exceptions.TestFailedException:
[info] ...
Run Code Online (Sandbox Code Playgroud)
您必须手动浏览两个地图才能找到它们之间的差异,您的收藏越大,它就越难.
另一方面,在RSpec中你会得到:
expect({a: 1, b: 2, c: 3}).to match({a: 1, b: 5, c: 3})
// RSpec output:
Failure/Error: it { expect({a: 1, b: 2, c: 3}).to match({a: 1, b: …Run Code Online (Sandbox Code Playgroud) 我正在" com.holdenkarau.spark-testing-base "和scalatest的帮助下测试Spark Streaming应用程序.
import com.holdenkarau.spark.testing.StreamingSuiteBase
import org.apache.spark.rdd.RDD
import org.scalatest.{ BeforeAndAfter, FunSuite }
class Test extends FunSuite with BeforeAndAfter with StreamingSuiteBase {
var delim: String = ","
before {
System.clearProperty("spark.driver.port")
}
test(“This Fails“) {
val source = scala.io.Source.fromURL(getClass.getResource(“/some_logs.csv"))
val input = source.getLines.toList
val rowRDDOut = Calculator.do(sc.parallelize(input)) //Returns DataFrame
val report: RDD[String] = rowRDDOut.map(row => new String(row.getAs[String](0) + delim + row.getAs[String](1))
source.close
}
}
Run Code Online (Sandbox Code Playgroud)
我得到字段' delim '的序列化异常:
org.apache.spark.SparkException: Task not serializable
[info] at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:304)
[info] at org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:294)
[info] at …Run Code Online (Sandbox Code Playgroud) 我正在用ScalaTest的Selenium DSL编写Selenium测试,我遇到了无法解释的超时问题.为了使问题更复杂,它们似乎只是在某些时候发生.
每当我在页面加载或一些Javascript渲染后访问元素时,就会出现问题.它看起来像这样:
click on "editEmployee"
eventually {
textField(name("firstName")).value = "Steve"
}
Run Code Online (Sandbox Code Playgroud)
我的PatienceConfig配置如下:
override implicit val patienceConfig: PatienceConfig =
PatienceConfig(timeout = Span(5, Seconds), interval = Span(50, Millis))
Run Code Online (Sandbox Code Playgroud)
测试失败,出现以下错误:
- should not display the old data after an employee was edited *** FAILED ***
The code passed to eventually never returned normally. Attempted 1 times over 10.023253653000001 seconds.
Last failure message: WebElement 'firstName' not found.. (EditOwnerTest.scala:24)
Run Code Online (Sandbox Code Playgroud)
有意义的是它没有立即成功,因为click导致某些渲染,并且文本字段可能不会立即可用.但是,尝试找到它不应该花费10秒钟,对吗?
此外,我发现非常有趣的是,最终块只尝试了一次,而且几乎只需要10秒钟.这闻起来像某个地方发生了超时,而且不是我的PatienceConfig,因为它被设置为在5秒后超时.
通过此解决方法,它确实有效:
click on "editEmployee"
eventually {
find(name("firstName")).value // from ScalaTest's `OptionValues` …Run Code Online (Sandbox Code Playgroud)