f# - 比较歧视工会

标签 f# discriminated-union fsunit

我是 F# 的新手,我正在玩 FParsec。我会使用 FParsec 来生成一个 AST。我想使用 FsUnit 围绕解析器的各个部分编写一些测试以确保正确操作。

我在语法上遇到了一些麻烦(抱歉,确切的代码在起作用,我可以稍后发布一个具体的例子)那么究竟如何比较两个不同的联合(一个是预期的,另一个是实际的结果)?有人可以提供一个使用 FsUnit(或 NUnit)的小代码示例吗?

判别联合示例(非常简单)

type AST = 
    | Variable of string
    | Class of string
    | Number of int

最佳答案

正如 Brian 指出的那样,F# 联合具有结构相等性,因此使用您喜欢的任何单元测试框架都很容易。

FsUnit 是一个构建在 NUnit 之上的 F# 特定库。我个人最喜欢的 F# 特定单元测试库是 Unquote , ;),它与框架无关,与 NUnit、xUnit.net、MbUnit 甚至在 FSI 中工作得非常好。您可能感兴趣 this与 FsUnit 的比较。

那么,您将如何使用 NUnit + Unquote 来做到这一点?这是一个完整的工作示例:

module UnitTests

open NUnit.Framework
open Swensen.Unquote

type AST = 
    | Variable of string
    | Class of string
    | Number of int

let mockFParsec_parseVariable input = Variable(input)

[<Test>]
let ``test variable parse, passing example`` () =
    test <@ mockFParsec_parseVariable "x" = Variable("x") @>

[<Test>]
let ``test variable parse, failing example`` () =
    test <@ mockFParsec_parseVariable "y" = Variable("x") @>

然后使用 TestDriven.NET 运行测试,输出如下:
------ Test started: Assembly: xxx.exe ------

Test 'UnitTests.test variable parse, failing example' failed: 

UnitTests.mockFParsec_parseVariable "y" = Variable("x")
Variable "y" = Variable("x")
false
    C:\xxx\UnitTests.fs(19,0): at UnitTests.test variable parse, failing example()

1 passed, 1 failed, 0 skipped, took 0.80 seconds (NUnit 2.5.10).

关于f# - 比较歧视工会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7424332/

相关文章:

f# - 获取数组、列表或序列的第 N 个元素的不同参数顺序

c# - C# 中的 FSharpChoice

F#单元测试: nunit.框架程序集未引用错误

f# - 是否可以在 F# 中组合多个属性?

f# - F# 中带有浮点迭代器的列表推导式

f# - 访问 DU 成员的命名字段

f# - 如何在 f# 中为可区分联合定义运算符

generics - 将 NUnit 与通用可区分联合结合使用

visual-studio-2013 - Visual Studio FsUnit 测试设置 - 异常 NUnit.Engine.NUnitEngineException

f# - 单元测试 : '[] |> should equal List.empty' is not working as expected