F#- 如何在 F# 中使用 Assert.Multiple

San*_*mar 2 f# nunit

我正在运行一些 NUnit 测试,并希望我的每个测试用例在退出之前运行所有断言直到块结束,即使断言失败很少。我看到有 Assert.Multiple ( https://github.com/nunit/docs/wiki/Multiple-Asserts ) 可以达到这个目的,但我收到一个错误:

方法“Multiple”没有重载匹配。可用的重载如下所示。可能的重载:'Assert.Multiple(testDelegate: TestDelegate) : unit'。类型约束不匹配。'unit' 类型与 'TestDelegate' 类型不兼容。可能的重载:'Assert.Multiple(testDelegate: AsyncTestDelegate) : unit'。类型约束不匹配。'unit' 类型与 'AsyncTestDelegate' 类型不兼容。在项目“NUnitTestProject1.fsproj”中完成构建目标“CoreCompile”——失败。

如果我有我的测试:

 [<Test>]
let getResponseCode () =
    let response = Request.createUrl Post "https://reqres.in/api/users"
                |> Request.setHeader (ContentType (ContentType.create("application", "json")))
                |> Request.bodyString """{ 
    "name": "morpheus",
    "job": "leader"}"""

                |> HttpFs.Client.getResponse
                |> run

     Assert.Multiple(() =>

                Assert.AreEqual(200,response.statusCode)
                Assert.AreEqual(215,response.contentLength)
            )
Run Code Online (Sandbox Code Playgroud)

我应该如何编写它以便它不会在使用 Assert.Multiple 时给我一个错误?提前致谢。

在此处检查错误的屏幕截图:

bru*_*own 5

您需要在这里使用 lambda。您在那里使用的语法是 lambda 的 C# 语法,在 F# 中,语法是fun () -> ...,因此在您的情况下,它看起来像

Assert.Multiple(fun () ->
    Assert.AreEqual(200, response.StatusCode)
    Assert.AreEqual(215, response.ContentLength)
)
Run Code Online (Sandbox Code Playgroud)