首页 > 解决方案 > F#- 如何在 F# 中使用 Assert.Multiple

问题描述

我正在运行一些 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)
            )

我应该如何编写它,以免在使用 Assert.Multiple 时出现错误?提前致谢。

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

标签: f#nunit

解决方案


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

Assert.Multiple(fun () ->
    Assert.AreEqual(200, response.StatusCode)
    Assert.AreEqual(215, response.ContentLength)
)

推荐阅读