gpt4 book ai didi

f# - 如何使用 xUnit 测试 F# 选项类型

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

我想在 F# 中使用 xUnit 对这段代码进行单元测试。我如何处理这些选项?

来自 Scott Wlaschin 的书:Domain Modeling Made Functional

type UnitQuantity = private UnitQuantity of int
// ^ private constructor

// define a module with the same name as the type
module UnitQuantity =
/// Define a "smart constructor" for UnitQuantity
/// int -> Result<UnitQuantity,string>
let create qty =
if qty < 1 then
// failure
Error "UnitQuantity can not be negative"
else if qty > 1000 then
// failure
Error "UnitQuantity can not be more than 1000"
else
// success -- construct the return value
Ok (UnitQuantity qty)

测试:
let ``Check UnitQuantity.create is one`` () =

// ARRANGE
let expected = 1

// ACT
//let unitQtyResult = UnitQuantity.create 1
match UnitQuantity.create 1 with
| Error msg -> 0
//printfn "Failure, Message is %s" msg
| Ok x -> 0
// let innerValue = UnitQuantity.value actual

// ASSERT
//Assert.Equal(expected,actual)

我知道 ACT全错了,那是我挂断的地方。我对 F# 选项、xUnit.net 或单元测试的了解不够充分,无法断言函数的实际值。

最佳答案

我可能会直接比较结果而不是模式匹配。但是,您不能创建 Ok Result<UnitQuantity, string> 的结果因为private构造函数。

您可以使用内置的 Result.map 映射 Ok结果的值(value)。使用 UnitQuantity.value您可以从 Result<UnitQuantity, string> 映射至 Result<int, string> .所以这应该有效:

let expected = Ok 1

let actual = UnitQuantity.create 1 |> Result.map UnitQuantity.value

Assert.Equal(expected, actual)

关于f# - 如何使用 xUnit 测试 F# 选项类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57491375/

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