我有一个通用的 C# 接口,我正在尝试使用 FakeItEasy 来模拟它,以进行如下所示的 xUnit 测试:
#region FakeItEasyDebugging
public interface IFakeTest<T> : IDisposable where T : new()
{
/// <summary>
/// Gets data.
/// </summary>
/// <param name="key">Data key</param>
/// <param name="data">Data from database, null if not found</param>
/// <returns>Returns True if found</returns>
bool GetData(string key, out T data);
}
public class TestClass
{
public int Foo { get; set; } = 0;
}
public class FakeTest
{
[Fact]
public void TestFakeItEasy()
{
const string testKey = "some";
IFakeTest<TestClass> testObj = A.Fake<IFakeTest<TestClass>>();
A.CallTo(() => testObj.GetData(testKey, out data)).Returns(true).AssignsOutAndRefParameters(new TestClass());
}
}
#endregion
但是,尽管它看起来很像文档指示我做的事情,但这不起作用:
https://fakeiteasy.github.io/docs/8.0.0/assigning-out-and-ref-parameters/
我收到的错误消息是 CS0103:名称“数据”在当前上下文中不存在。
我也没有从 Visual Studio 得到任何有用的建议。
那么,我应该如何编写 CallTo 行才能使其真正工作并指定模拟 IFakeTest.GetData 方法的行为方式?
A.CallTo(() => testObj.GetData(testKey, out TestClass data)).Returns(true).AssignsOutAndRefParameters(new TestClass());
产生CS8198。
A.CallTo(() => testObj.GetData(testKey, out TestClass)).Returns(true).AssignsOutAndRefParameters(new TestClass());
产生CS0118。
正如您所注意到的,编译器向您抱怨,因为您没有在任何地方定义
data
。无论是否使用 FakeItEasy,如果不声明 GetData(testKey, out data)
,data
都不会编译。
TestClass data;
A.CallTo(() => testObj.GetData(testKey, out data)).Returns(true).AssignsOutAndRefParameters(new TestClass());