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)