【问题标题】:How do you define an F# lambda function to return a specific data type?如何定义 F# lambda 函数以返回特定数据类型?
【发布时间】:2021-07-15 22:35:34
【问题描述】:

我正在尝试使用 Moq 分配回调,但无法弄清楚如何定义返回布尔值的 lambda 函数。在 C# 中,这对我来说非常简单,但我在尝试将其转换为 F# 等效项时遇到了问题。

let mockHttpMessageHandler = Mock<HttpMessageHandler>(MockBehavior.Strict)
mockHttpMessageHandler
    .Protected()
    .Setup<Task<HttpResponseMessage>>(
        "SendAsync",
        It.IsAny<HttpRequestMessage>()
    )
    .ReturnsAsync(
        dummyHttpResponseMessage
    )
    .Callback<HttpClient>(fun r -> r.DefaultRequestHeaders.Contains("SomeHeaderHere"))
    .Verifiable()

正如您从屏幕截图中看到的那样,我收到一个 FS0001 错误,指出该表达式应具有单位 (void) 类型,但它返回一个布尔值(这实际上是我想要返回的类型。

屏幕截图显示我正在寻找一个空字符串,它不会是最终代码所反映的内容,但可以用作示例,并且非空字符串仍然会产生相同的错误,因此与问题无关。

我将如何修改这个 lambda 表达式来表达函数以期望 boolean 的结果而不是 void?

【问题讨论】:

  • 错误信息是正确的。 Moq 的Callback 函数需要一个返回unit 的lambda,而不是bool。我认为这通常用于modify the data or cause some other side-effect。也许您可以发布您要翻译的 C# 代码,以便我们了解您要做什么?
  • 我打算发布 C# 代码,直到再次查看它并观察您的评论后,它似乎是我在翻译中的错误。甚至我引用的 C# 代码也说明了数据的操作,因此它也没有返回任何内容。

标签: f# moq


【解决方案1】:

正如 brianberns 在评论中所说,Callback 函数需要一个返回单位的函数。

您可以通过这样的方式实现我认为您想要的(在此处使用 XUnit 中的 Assert。):

.Callback<HttpClient>(fun r -> r.DefaultRequestHeaders.Contains(") |> Assert.True ())

【讨论】:

  • 这实际上是我试图在我的代码中实现的目标,它现在可以在没有错误的情况下工作。我只需要解决另一个不相关的问题,即解决方法和回调的不匹配签名。可能需要创建/派生某种类型的 MessageHandler 对象扩展。但是您的代码推荐解决了最初的问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多