1

ユニットテストには素晴らしいFSUnitを使用しています。これは正常に機能しますが、テストの本体では、#light構文の代わりに完全なF#構文(各行の末尾に「in」を付けるなど)を使用する必要があります。例えば:

module MyTests

open System
open NUnit.Framework
open FsUnit
open MyModule

[<TestFixture>] 
type ``Given a valid file`` () =

    let myFile = createSomeFile()

    [<Test>] member x.
     ``Processing the file succeeds`` () =
        let actual = processFile myFile in
        actual |> should be True

テストの最初の行の最後にある「in」に注意してください。これがないと、テストはコンパイルされません。これは、短いテストでは問題ありませんが、長いテスト方法では問題になります。ソースに明示的な#lightを追加しようとしましたが、違いはないようです。これは、多くのモジュールを含む大規模なプロジェクトの一部であり、テストモジュールを除くすべてのモジュールがlight構文を(明示的な#lightなしで)うまく使用しています。テストモジュールで完全な構文をトリガーするものは何ですか?

4

1 に答える 1

2

クラスのメンバーを作成するときは、少し異なるインデントを使用する必要があります。以下は問題ないはずです:

[<TestFixture>]  
type ``Given a valid file`` () = 
    let myFile = createSomeFile() 

    [<Test>] 
    member x.``Processing the file succeeds`` () = 
        let actual = processFile myFile
        actual |> should be True 

最初の問題は、メンバーの名前をさらにインデントする必要があること.です。2番目の問題は、メンバーの本体をキーワードよりもさらにインデントする必要があることですmember。バージョンでは、キーワードは後に書き込ま[<Test>]れるため、インデントすると機能します。さらに体。

追加inすると問題が解決します。これは、コードの解釈方法をコンパイラーに明示的に指示するためです(したがって、インデント規則に依存しません)。

module余談ですが、一部の単体テストフレームワークでは、構文を少し軽くするために使用することもできます(ただし、初期化が必要な場合、つまりファイルをロードする場合に、どのように機能するかはわかりません)。

[<TestFixture>]  
module ``Given a valid file`` = 
    let myFile = createSomeFile() 

    [<Test>] 
    let ``Processing the file succeeds`` () = 
        let actual = processFile myFile
        actual |> should be True 
于 2012-05-18T09:14:03.457 に答える