【发布时间】:2015-08-19 06:13:42
【问题描述】:
我以前用 C# 写
var provider = A.Fake<ITimeProvider>();
A.CallTo(() => provider.Fetch()).ReturnsLazily(call => data[0]);
container.Register(() => provider);
捕获对Fetch()的调用。
当我用 F# 尝试过同样的事情时
let provider = A.Fake<ITimeProvider>()
A.CallTo(fun () -> provider.Fetch()).ReturnsLazily(fun call -> data.[0]) |> ignore
container.Register(fun () -> provider)
测试失败
Test Error : ....Test
System.ArgumentException : The specified object is not recognized as a fake object.
at Microsoft.FSharp.Control.AsyncBuilderImpl.commit[a](Result`1 res)
at Microsoft.FSharp.Control.CancellationTokenOps.RunSynchronously[a](CancellationToken token, FSharpAsync`1 computation, FSharpOption`1 timeout)
at Microsoft.FSharp.Control.FSharpAsync.RunSynchronously[T](FSharpAsync`1 computation, FSharpOption`1 timeout, FSharpOption`1 cancellationToken)
...
看起来对于 F#,它的定义应该有点不同。你知道怎么做吗?
【问题讨论】:
-
我不是 F# 的人,但我想写 F#,我得到了这个。我会对自己说,“
fun () => provider.Fetch”解析为什么类型?为了让 FakeItEasy 使用它,它应该相当于Expression<Action<ITimeProvider>>。 -
我不是 FakeItEasy 的人,但如果 FakeItEasy 依赖于解析或反映 lambda 表达式,那么你就不走运了。尽管语法相似,但 F# 函数不是 lambda 表达式,因为您可以使用 C# 表达式 API 操作它们。
标签: c# f# fakeiteasy