swift - 如何在 Swift 中控制单元测试的随机性?
问题描述
我想RandomNumberGenerator
为我的班级注入一个以编写单元测试。但是,似乎接收随机数生成器的方法仅适用于具体类型。
意思就是
var rng: RandomNumberGenerator = SystemRandomNumberGenerator()
Bool.random(using: &rng)
不编译,报错:
在参数类型中
inout RandomNumberGenerator
,RandomNumberGenerator
不符合预期类型RandomNumberGenerator
但
var rng = SystemRandomNumberGenerator()
Bool.random(using: &rng)
做。
问题是我想在运行我的应用程序时使用默认的随机数生成器,并使用我控制的自定义随机数生成器进行测试。为了在 Swift 中制作可测试的代码,控制随机性的一般方法是什么?
解决方案
从这个protocol-doesnt-conform-to-itself,我使用了“构建类型橡皮擦”的答案
struct AnyRandomNumberGenerator: RandomNumberGenerator {
private var generator: RandomNumberGenerator
init(_ generator: RandomNumberGenerator) {
self.generator = generator
}
mutating func next() -> UInt64 {
return self.generator.next()
}
public mutating func next<T>() -> T where T : FixedWidthInteger, T : UnsignedInteger {
return self.generator.next()
}
public mutating func next<T>(upperBound: T) -> T where T : FixedWidthInteger, T : UnsignedInteger {
return self.generator.next(upperBound: upperBound)
}
}
那么它可以像这样使用
var randomNumberGenerator: RandomNumberGenerator = SystemRandomNumberGenerator()
var random = AnyRandomNumberGenerator(randomNumberGenerator)
UInt8.random(in: .min ... .max, using: &random)
推荐阅读
- java - Hibernate 无法对 JDBC 执行模式管理
- amazon-rds - 如何在 RDS 中为 oracle 更新listerner.ora?
- docker - docker 网络设备分配
- kotlin - 将 kotlin 多平台库发布到 Maven Central(InvalidMavenPublicationException 多个工件具有相同的......)
- karate - 如何在空手道中找到鼠标悬停功能的 x 和 y 坐标
- c# - 在 libnfc 上使用 pinvoke 获取字符串值的无效指针异常
- c# - 同一线程上的 HttpWebRequest.BeginGetResponse 回调
- selenium - 如何在查找 UI 上不存在的 web 元素时绕过隐式等待条件?
- android - 文本视图未在真实设备上显示
- python - 用一些语法编写格式化的 ASCII 文件