gpt4 book ai didi

swift - 如何在 Swift 中控制单元测试的随机性?

转载 作者:行者123 更新时间:2023-11-30 10:29:04 29 4
gpt4 key购买 nike

我想向我的类注入(inject)一个 RandomNumberGenerator 以便编写单元测试。然而,接收随机数生成器的方法似乎只适用于具体类型。

这意味着

var rng: RandomNumberGenerator = SystemRandomNumberGenerator()
Bool.random(using: &rng)

无法编译,出现错误:

In argument type inout RandomNumberGenerator, RandomNumberGenerator does not conform to expected type 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)

关于swift - 如何在 Swift 中控制单元测试的随机性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59520001/

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