我试图使用FakeItEasy来模拟在C#中定义的接口
public interface IMyInterface
{
int HeartbeatInterval { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在F#测试我做
let myFake = A.Fake<IMyInterface>()
A.CallTo(fun () -> ((!myFake).HeartbeatInterval)).Returns(10) |> ignore
Run Code Online (Sandbox Code Playgroud)
在测试运行器中运行此结果
System.ArgumentException
Expression of type 'Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,System.Int32]' cannot be used for return type 'System.Int32'
事实上,它似乎是为任何返回类型执行此操作,例如,如果HeartbeatInterval返回类型,foo则抛出的异常将是类型foo而不是System.Int32.
我做错了还是F#和FakeItEasy之间有些不兼容?
我已经想到使用Object Expression可能是一种更容易的方法.
在C#中,我可以声明未初始化的变量,然后在类的各种方法中将其分配给它们.例如,在NUnit测试中,我可以声明一个仅在设置方法中初始化然后在各种测试中重复使用的类型变量.
private MyTestClass sut;
public Setup()
{
sut = new MyTestClass();
etc.
}
public FirstTest()
{
sut.DoSomeWork(1);
}
public SecondTest()
{
sut.DoSomeWork(2);
}
Run Code Online (Sandbox Code Playgroud)
我想在F#中做相同的事情.但是根据这个和其他人的说法,未分配的'变量'并不是F#中的完成.
在我的F#测试的情况下,测试不是在任何类型中,只是在模块内,所以[<DefaultValue>] val不起作用.使用mutablejust感觉不对,因为这似乎是F#编码器的最后选择.
由于idomatic F#不应该需要未分配的值,解决这个问题的"正确"方法是什么?