【问题标题】:Comparing Discriminated Unions比较受歧视的工会
【发布时间】:2011-11-17 11:15:01
【问题描述】:

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

我在语法上遇到了一些问题(抱歉,确切的代码正在工作,我可以稍后发布一个具体示例)所以如何准确地比较两个有区别的联合(一个是预期的,另一个是实际的结果)?有人可以提供一个使用 FsUnit(或 NUnit)的小代码示例吗?

判别联合的例子(很简单)

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

【问题讨论】:

  • (F# 联合具有结构相等性,这意味着= 做正确的事情,比较整个结构/值。)

标签: f# discriminated-union fsunit


【解决方案1】:

正如 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).

【讨论】:

  • 谢谢,我下班后试试。看到您的示例后,我想我现在知道自己做错了什么。我正在使用(变量“VAR”),但应该一直使用变量(“VAR”)作为我的预期......希望很快就会标记为已回答!
  • 工作就像一个魅力,谢谢。我要仔细看看 unquote,因为 FsUnit 在这里不适合我......
  • 取消引用很棒,很喜欢。谢谢
【解决方案2】:

一个例子 - 如果你想检查类型而不是内容

let matched x= 
    match x with
    |Variable(_) -> true
    | _ -> false

请注意,您需要为可区分联合的每个元素使用不同的函数

如果你想比较相等,你可以用标准的方式来做,比如

Assert.AreEqual(Variable("hello"),result)

if result = Variable("hello") then stuff()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2023-02-19
    • 2011-03-19
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2019-05-04
    相关资源
    最近更新 更多