我无法通过这段代码。
[<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())
我得到例外:
System.ArgumentException : Expression of type 'System.Void' cannot be used for constructor parameter of type 'Microsoft.FSharp.Core.Unit'
我认为它与F#有关,没有正确推断labda表达式的数据类型,但我不知道如何解决这个问题。
答案 0 :(得分:5)
你是对的,这是调用接受Action或Func的重载方法时F#类型推断的问题。
一种选择是从Moq.FSharp.Extensions下载Nuget并将您的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.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)