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

F# 为什么Moq验证方法调用引发异常?,f#,moq,F#,Moq,我无法让这段代码通过 [<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()) 我相信这与

我无法让这段代码通过

[<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())

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

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

一个选项是从下载并将您的
Verify
更改为显式
VerifyAction
,即

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类似的API,但专门设计用于F#,也可通过以下途径获得:

[]
成员public this.Test()=
让mock=mock.Of()
模拟添加(“aaa”)
Mock.Verify(,一次)

谢谢您的回答。我想知道,如果我能明确指定我要使用的重载吗?很抱歉,我目前还不知道一种显式指定重载的方法,如果你不想拉入Moq.FSharp.Extensions,你可以在答案中间拉入类型扩展到Moq。
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())
type Moq.Mock<'TAbstract> when 'TAbstract : not struct with
    member mock.VerifyAction(expression:Expression<Action<'TAbstract>>) =
        mock.Verify(expression)
[<Test>]
member public this.Test() =
    let mock = Mock.Of<IList<string>>()           
    mock.Add("aaa")        
    Mock.Verify(<@ mock.Add(any()) @>, once)