5

私は F# の初心者で、FParsec をいじっています。FParsec を使用して AST を生成します。FsUnit を使用して、パーサーのさまざまな部分に関するいくつかのテストを作成し、正しい操作を保証したいと考えています。

構文に少し問題があります(申し訳ありませんが、正確なコードは機能しています。後で特定の例を投稿できます)、2つの識別された共用体(1つは予想され、もう1つは実際の結果)を正確に比較するにはどうすればよいですか?誰かが FsUnit (または NUnit) を使用した小さなコード例を提供してくれませんか?

判別共用体の例 (非常に単純)

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

2 に答える 2

6

Brian が指摘したように、F# の共用体には構造上の等価性があるため、好きなユニット テスト フレームワークを使用することは簡単です。

FsUnit は、NUnit の上に構築された F# 固有のライブラリです。私の個人的なお気に入りの F# 固有の単体テスト ライブラリはUnquote (;) です。これはフレームワークに依存せず、NUnit、xUnit.net、MbUnit など、または FSI 内でも非常にうまく機能します。この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).
于 2011-09-15T03:02:21.237 に答える
2

例 - タイプは確認したいが内容は確認したくない場合

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

ここで、判別共用体の要素ごとに異なる関数が必要であることに注意してください

同等性を比較したい場合は、次のように標準的な方法で行うことができます

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

また

if result = Variable("hello") then stuff()
于 2011-09-15T00:02:24.853 に答える