如何忽略FsUnit的断言中有区别的联合案例的价值?

斯科特·尼姆罗德(Scott Nimrod)

如何忽略FsUnit的断言中有区别的联合案例的价值?

举个例子:

type TransactionAttempt = { 
    Deposited:float
    Requires:float 
}

type RequestResult =
    | Denied of TransactionAttempt
    | Granted of Product

在我的测试中,我想这样做:

let display = balance |> select Pepsi
display |> should equal Denied

我不介意这样做:

display |> should equal (Denied _)

但是,我被迫这样做:

display |> should equal (Denied {Deposited=0.25; Requires=1.00})

注意我必须对上面的表达式有多明确。

因此,我只想知道它是否被拒绝。我不在乎细节。

这是实际的测试:

[<Test>]
let ``Vending machine reflects more money required for selection``() =
   // Setup
   let balance = Quarter |> insert []

   // Test
   let display = balance |> select Pepsi

   // Verify
   display |> should equal (Denied {Deposited=0.25; Requires=1.00})

功能如下:

let select product balance =
    let attempt = { Deposited=balance
                    Requires=product |> getPrice }

    let paidInFull = attempt.Deposited >= attempt.Requires

    if not paidInFull then 
        Denied attempt
    else Granted product

这是整个域:

module Machine

type Deposit =
    | Nickel
    | Dime
    | Quarter
    | OneDollarBill
    | FiveDollarBill

type TransactionAttempt = { 
    Deposited:float
    Requires:float 
}

type State =
    | OutOfService
    | PaymentReceived of Deposit
    | WaitingForSelection
    | NotPaidInFull of TransactionAttempt

type Product =
    | Pepsi
    | Coke
    | Sprite
    | MountainDew

type RequestResult =
    | Denied of TransactionAttempt
    | Granted of Product

(* Functions *)
open System

let display = function
    | OutOfService            -> "Out of Service"
    | WaitingForSelection     -> "Make selection"
    | NotPaidInFull attempt   -> sprintf "%s Required" ((attempt.Requires - attempt.Deposited).ToString("C2"))
    | PaymentReceived deposit -> match deposit with
                                 | Nickel         -> "5¢"
                                 | Dime           -> "10¢"
                                 | Quarter        -> "25¢"
                                 | OneDollarBill  -> "$1.00"
                                 | FiveDollarBill -> "$5.00"

let getBalance coins =
    coins |> List.fold (fun acc d -> match d with
                                     | Nickel         -> acc + 0.05
                                     | Dime           -> acc + 0.10
                                     | Quarter        -> acc + 0.25
                                     | OneDollarBill  -> acc + 1.00
                                     | FiveDollarBill -> acc + 5.00) 0.00
let insert balance coin =
    coin::balance |> getBalance

let getPrice = function
    | Pepsi       -> 1.00
    | Coke        -> 1.00
    | Sprite      -> 1.00
    | MountainDew -> 1.00

let select product balance =
    let attempt = { Deposited=balance
                    Requires=product |> getPrice }

    let paidInFull = attempt.Deposited >= attempt.Requires

    if not paidInFull then 
        Denied attempt
    else Granted product

我能想到的最简单的事情是为所需的支票写一个谓词:

let isDenied du =
    match du with
    | Denied _ -> true
    | _ -> false

或既然let f x = match x with ...等效于let f = function ...,则可能是:

let isDenied = function Denied _ -> true | _ -> false

然后您的测试如下所示:

display |> isDenied |> should be True

注意True,以大写字母T为约束。如果您要与布尔值进行比较,那么它将是

display |> isDenied |> should equal true

如果发现必须编写这些自定义谓词的全部内容,则可能存在更通用的解决方案,其中包括为NUnit或XUnit或后端使用的任何测试框架编写自定义约束。但是,作为F#的相对新手,您可能应该首先使用简单的解决方案,然后再对其进行概括。

PS如果您确实决定编写自定义约束,请查看https://github.com/fsprojects/FsUnit/blob/master/src/FsUnit.NUnit/FsUnit.fs(如果您使用的是NUnit)或https:/ /github.com/fsprojects/FsUnit/blob/master/src/FsUnit.Xunit/FsUnit.fs(如果您使用的是XUnit)的灵感。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何忽略FsUnit的断言中有区别的联合案例的价值?

来自分类Dev

如果断言中有特定的唯一值,该如何断言?

来自分类Dev

如何复制有区别的工会案例值?

来自分类Dev

使用Reflection.Emit生成有区别的联合

来自分类Dev

如何在TypeScript中将有区别的联合与函数重载结合在一起

来自分类Dev

如何断言我们在python中有AssertionError?

来自分类Dev

F#:将对象表达式与有区别的联合一起使用

来自分类Dev

F#-我可以从函数中返回有区别的联合

来自分类Dev

两者在C语言中有什么区别?

来自分类Dev

两者在C语言中有什么区别?

来自分类Dev

在C中有断言问题

来自分类Dev

如何获得枚举案例的价值?

来自分类Dev

如何显示在Laravel中有价值的多列

来自分类Dev

如何遍历联合案例列表并访问每个案例的数据?

来自分类Dev

如何在Seaborn中创建具有多个组或类别的联合图?

来自分类Dev

在序言中有“超出全球范围”

来自分类Dev

MATLAB中有C联合功能吗?

来自分类Dev

案例79-70中有重复的案例标签

来自分类Dev

如何用别的东西代替所有的存在价值

来自分类Dev

如何在For循环中有条件地更新多个类别的值

来自分类Dev

如何忽略所有失败案例与伊斯坦布尔的承诺

来自分类Dev

TypeScript确保所有案例都处理联合类型

来自分类Dev

Spock和Spock报告:如何打印在Label / Block中有价值的变量

来自分类Dev

如何比较流利的断言中的null和string.Empty(或“”)?

来自分类Dev

如何在SoapUI断言中检查非此数字

来自分类Dev

如何在系统Verilog断言中编写属性?

来自分类Dev

如果Typescript中满足条件,如何断言联合类型的类型?

来自分类Dev

忽略没有价值的领域

来自分类Dev

通过案例联合查询

Related 相关文章

  1. 1

    如何忽略FsUnit的断言中有区别的联合案例的价值?

  2. 2

    如果断言中有特定的唯一值,该如何断言?

  3. 3

    如何复制有区别的工会案例值?

  4. 4

    使用Reflection.Emit生成有区别的联合

  5. 5

    如何在TypeScript中将有区别的联合与函数重载结合在一起

  6. 6

    如何断言我们在python中有AssertionError?

  7. 7

    F#:将对象表达式与有区别的联合一起使用

  8. 8

    F#-我可以从函数中返回有区别的联合

  9. 9

    两者在C语言中有什么区别?

  10. 10

    两者在C语言中有什么区别?

  11. 11

    在C中有断言问题

  12. 12

    如何获得枚举案例的价值?

  13. 13

    如何显示在Laravel中有价值的多列

  14. 14

    如何遍历联合案例列表并访问每个案例的数据?

  15. 15

    如何在Seaborn中创建具有多个组或类别的联合图?

  16. 16

    在序言中有“超出全球范围”

  17. 17

    MATLAB中有C联合功能吗?

  18. 18

    案例79-70中有重复的案例标签

  19. 19

    如何用别的东西代替所有的存在价值

  20. 20

    如何在For循环中有条件地更新多个类别的值

  21. 21

    如何忽略所有失败案例与伊斯坦布尔的承诺

  22. 22

    TypeScript确保所有案例都处理联合类型

  23. 23

    Spock和Spock报告:如何打印在Label / Block中有价值的变量

  24. 24

    如何比较流利的断言中的null和string.Empty(或“”)?

  25. 25

    如何在SoapUI断言中检查非此数字

  26. 26

    如何在系统Verilog断言中编写属性?

  27. 27

    如果Typescript中满足条件,如何断言联合类型的类型?

  28. 28

    忽略没有价值的领域

  29. 29

    通过案例联合查询

热门标签

归档