gpt4 book ai didi

f# - 为什么 Moq 验证方法调用会引发异常?

转载 作者:行者123 更新时间:2023-12-01 01:07:22 25 4
gpt4 key购买 nike

我无法通过这段代码。

[<Test>]
member public this.Test() =
let mock = new Mock<IList<string>>()
let mockObj = mock.Object

mockObj.Add("aaa")
mock.Verify(fun m -> m.Add(It.IsAny<string>()), Times.Once())

我得到的异常(exception):
System.ArgumentException : Expression of type 'System.Void' cannot be used for constructor parameter of type 'Microsoft.FSharp.Core.Unit'

我相信这与 F# 没有正确推断 labda 表达式的数据类型有关,但我不知道如何解决这个问题。

最佳答案

您是对的,这是调用接受 Action 或 Func 的重载方法时 F# 类型推断的问题。

一种选择是下载 Moq.FSharp.Extensions来自 Nuget并更改您的 Verify到一个明确的 VerifyAction , IE。

open Moq.FSharp.Extensions

type MyTests() =
[<Test>]
member public this.Test() =
let mock = new Mock<IList<string>>()
let mockObj = mock.Object
mockObj.Add("aaa")
mock.VerifyAction((fun m -> m.Add(any())), Times.Once())

在底层,Moq.FSharp.Extensions 只是定义了一个扩展方法 VerifyAction只需要一个 Action为避免歧义:
type Moq.Mock<'TAbstract> when 'TAbstract : not struct with
member mock.VerifyAction(expression:Expression<Action<'TAbstract>>) =
mock.Verify(expression)

另一种选择是使用 Foq ,一个模拟库,具有与 Moq 类似的 API,但专为 F# 使用而设计,也可通过 Nuget 获得:
[<Test>]
member public this.Test() =
let mock = Mock.Of<IList<string>>()
mock.Add("aaa")
Mock.Verify(<@ mock.Add(any()) @>, once)

关于f# - 为什么 Moq 验证方法调用会引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31460442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com