gpt4 book ai didi

unit-testing - 斯卡拉模拟。模拟一个接受参数的类

转载 作者:行者123 更新时间:2023-12-04 15:24:30 25 4
gpt4 key购买 nike

完全披露:我对模拟和模拟框架非常陌生。我正在尝试使用 ScalaMock,因为它似乎是与 ScalaTest 一起使用的“默认”模拟框架,但我很高兴使用与 ScalaTest 兼容的任何其他框架。

问题:我在 Scala 中编写了一个与套接字对话的类。该类有一个类型参数,表示要与哪种套接字通信,其中一个参数是用于创建该类型套接字的工厂。它有签名:

class XScanner[T <: SocketClient](
confPath: String = "/etc/default/configPath",
socketClientFactory: String => T
) extends ScannerBase(path)

我希望能够通过提供一个模拟 SocketClient 来为这个类编写单元测试,这样我的测试代码就不必连接到真正的套接字,但我无法弄清楚如何使用 ScalaMock 来做到这一点。

我的测试代码如下所示:
val t = new XScanner[SocketClient](confPath, (s: String) => mock[SocketClient])

显然这不会编译,因为 SocketClient期望套接字的路径作为参数,但我无法调用 mock[SocketClient(s)]因为那不是类型而且我不能打电话 mock[SocketClient](s)因为 mock 不会将传递给它的类型的参数作为它自己的参数。

那么我该如何编写模拟 SocketClient工厂传递给我的扫描仪?我什至不知道如何模拟一个带参数的类!

最佳答案

洞察力是你需要模拟的是socketClientFactory .然后设置它返回一个模拟 SocketClient .

鉴于:

trait SocketClient {
def frobnicate(): Unit
}

class ScannerBase(path: String)

class XScanner[T <: SocketClient](
confPath: String = "/etc/default/configPath",
socketClientFactory: String => T
) extends ScannerBase(confPath) {
val socket = socketClientFactory("Some Socket Name")
socket.frobnicate
}

(旁注 - 您的默认值 confPath 永远无法使用,因为 socketClientFactory 没有默认值)。

那么这应该让你开始(这是使用 Scala 2.9.x 和 ScalaMock2 - 使用 ScalaMock3 的 2.10.x 会略有不同,但不会太大):
import org.scalatest.FunSuite
import org.scalamock.scalatest.MockFactory
import org.scalamock.generated.GeneratedMockFactory

class ScannerTest extends FunSuite with MockFactory with GeneratedMockFactory {

test("scanner") {
val mockFactory = mockFunction[String, SocketClient]
val mockClient = mock[SocketClient]
mockFactory.expects("Some Socket Name").returning(mockClient)
mockClient.expects.frobnicate
val scanner = new XScanner("path/to/config", mockFactory)
}
}

为了完整起见,这里是 Scala 2.10.0 和 ScalaMock3 中的相同测试:
import org.scalatest.FunSuite
import org.scalamock.scalatest.MockFactory

class ScannerTest extends FunSuite with MockFactory {

test("scanner") {
val mockFactory = mockFunction[String, SocketClient]
val mockClient = mock[SocketClient]
mockFactory.expects("Some Socket Name").returning(mockClient)
(mockClient.frobnicate _).expects()
val scanner = new XScanner("path/to/config", mockFactory)
}
}

关于unit-testing - 斯卡拉模拟。模拟一个接受参数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14274020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com