我有一个函数,应该得到两个实际参数进行测试.这两个值都应该由任意实例创建,因为它们需要具有一些不能完全随意的良好形式.
所以我创建了以下代码
let updating (x:SomeType) (y:SomeOtherType) =
let result = update x y
result.someProp = x.someProp
&& result.otherProp = y.otherProp
let arbSomeType =
Arb.generate<SomeType>
|> Gen.filter fun x -> x.checkSomeStuff
|> Arb.fromGen
let arbSomeType =
Arb.generate<SomeOtherType>
|> Gen.filter fun x -> x.checkPropertiesOfThis
|> Arb.fromGen
Run Code Online (Sandbox Code Playgroud)
但是,我现在如何组合这两个任意实例,以便它们与测试方法的签名相匹配?
//let prop = Prop.forAll arbSomeType + arbSomeType updating
Check.QuickThrowOnFailure prop
Run Code Online (Sandbox Code Playgroud)
给出两种类型,SomeTypeA并且SomeTypeB:
type SomeTypeA =
{ A : obj }
type SomeTypeB =
{ B : obj }
Run Code Online (Sandbox Code Playgroud)
您可以创建一个Property,其中输入是这两种类型,如下所示:
let prop =
gen { let! a = Arb.generate<SomeTypeA>
let! b = Arb.generate<SomeTypeB>
return a, b }
|> Arb.fromGen
|> Prop.forAll
<| fun (a, b) ->
// 'a' is SomeTypeA
// 'b' is SomeTypeB
true // Dummy - replace with whatever you want to do with 'a' and 'b'.
Run Code Online (Sandbox Code Playgroud)
您还需要注意,测试方法的签名现在反映了创建的任意 - 成对的(未发送的)函数.
// instead of
let updating (x:SomeType) (y:SomeOtherType) = ...
// do this
let updating (x:SomeType, y:SomeOtherType) = ...
Run Code Online (Sandbox Code Playgroud)
示例如何工作:
gen计算表达式创建类型的发电机Gen<SomeTypeA * SomeTypeB>Arbitrary<SomeTypeA * SomeTypeB>实例是从发生器产生Prop.forAll它总是一样的道路:
Generator[/optional Shrinker] -> Arbitrary -> Property -> <your_code>
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |