1

私は最初のジェネリック関数をF#で書き込もうとしていますが、ここでいくつかの概念が欠落しているようです:

module Assert =
    let ThrowsException<'e : exn>  functionUnderTest  =
    try 
        let result = functionUnderTest
        printfn "fails"
    with 
    | :? 'e  ->  printfn  "succeeds"
    | _  -> printfn "fails"

stdin(18,28):エラーFS0010:パターンに予期しないシンボル':'があります。'>'または他のトークンが必要です。

そのような関数を使用して、例外が発生したかどうかをテストできるようにしたいと思います。

let myFunction=HttpClient.postDocRaw "http://notexisting.com/post.php" "hello=data"
Assert.ThrowsException System.Net.WebException myFunction

このツールをテスト用に実現したいので、誰かが解決策を持っていればそれは素晴らしいことですが、さらに、私はF#を学んでおり、このような関数を作成しようとするとどこが間違っているのか知りたいです。

最終コード:

module Assert =
    let ThrowsException<'e when 'e :> exn>  functionUnderTest  =
        try 
           let actual = functionUnderTest()
           printfn "succeeds"
        with 
        | :? 'e  ->  printfn  "succeeds"
        | _  ->  Assert.Fail()


[<TestClass>]
type HttpClientTest() = 
[<TestMethod>]
    member x.PostDataWrongUrl() = 
        Assert.ThrowsException<System.Net.WebException>  (fun() ->  HttpClient.postDocRaw "http://notexisting.com/post.php" "hello=data")
4

1 に答える 1

7

型制約はの形式をとるため、エラーは「Expected'>'」'T when 'T :> baseTypeと表示されます。コードは次のようになります。

module Assert =
  let ThrowsException<'e when 'e :> exn> functionUnderTest =
    try 
      let result = functionUnderTest
      printfn "fails"
    with 
      | :? 'e -> printfn  "succeeds"
      | _  -> printfn "fails"

詳細については、MSDNの制約を参照してください。

于 2012-11-28T20:39:04.813 に答える