【问题标题】:A.CallTo(...).ReturnsLazily(...) throws "The specified object is not recognized as a fake object."A.CallTo(...).ReturnsLazily(...) 抛出“指定的对象未被识别为假对象。”
【发布时间】: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 () =&gt; provider.Fetch”解析为什么类型?为了让 FakeItEasy 使用它,它应该相当于 Expression&lt;Action&lt;ITimeProvider&gt;&gt;
  • 我不是 FakeItEasy 的人,但如果 FakeItEasy 依赖于解析或反映 lambda 表达式,那么你就不走运了。尽管语法相似,但 F# 函数不是 lambda 表达式,因为您可以使用 C# 表达式 API 操作它们。

标签: c# f# fakeiteasy


【解决方案1】:

FakeItEasy 使用 F# 3 支持的 LINQ 表达式,但是在使用静态 API 时似乎存在不兼容性。基于错误消息“对象未被识别为假对象”,我怀疑在这种情况下对象的分辨率是 C#/VB.Net 特定的。

FakeItEasy 的基于实例成员的设置似乎确实有效:

let fake = Fake<ITimeProvider>()
fake.CallsTo(fun x -> x.Fetch()).ReturnsLazily(fun () -> data.[0]) |> ignore
let provider = fake.FakedObject

另一种选择是使用 F# 和 Moq(这里我使用的是 Moq.FSharp.Extensions):

let mock = Mock<ITimeProvider>()
mock.SetupFunc(fun x -> x.Fetch()).Returns(data.[0]).End
let provider = mock.Object

或者Foq,专为 F# 设计:

let provider = 
    Mock<ITimerProvider>.Method(fun x -> <@ x.Fetch @>).Returns(data.[0])

【讨论】:

    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多